PostgreSQL 空列表 VALUES 表达式
PostgreSQL empty list VALUES expression
我正在尝试获取点列表并查询地理空间数据库,以找到所有匹配的行。
我有一个计算的 SQL 语句,如下所示:
cursor = connection.cursor()
cursor.execute(
'''
SELECT g.ident
FROM (VALUES %s) AS v (lon, lat)
LEFT JOIN customers g
ON (ST_Within(ST_SetSRID(ST_MakePoint(v.lon, v.lat), %s), g.poly_home));
''', [AsIs(formatted_points), SRID]
)
下面是 formatted_points 变量的示例:
(-115.062,38.485), (-96.295,43.771)
因此,当将其插入 SQL 表达式时,VALUES 表达式为:
(VALUES (-115.062,38.485), (-96.295,43.771)) AS v (lon, lat)
到目前为止一切顺利。但是,当点列表为空时,VALUES 表达式如下所示:
(VALUES ) AS v (lon, lat)
.. 这导致我得到这个错误:
django.db.utils.ProgrammingError: syntax error at or near ")"
换句话说,(VALUES )
是不合法的SQL。
问题来了:如何使用 VALUES 表示一个空列表?我可以对这个进行特殊处理,当这个函数传递一个空列表时只是 return 一个空列表,但这看起来不太优雅。
我查看了 PostgreSQL manual page 的 VALUES,但我不明白如何构造一个空的 VALUES 表达式。
如果您可以将 lons 和 lats 放在单独的数组中,则可以使用带有 unnest 的数组:
select * from unnest(ARRAY[1, 2, 3]::int[], ARRAY[4, 5, 6]::int[]) as v(lon, lat);
lon | lat
-----+-----
1 | 4
2 | 5
3 | 6
(3 rows)
select * from unnest(ARRAY[]::int[], ARRAY[]::int[]) as v(lon, lat);
lon | lat
-----+-----
(0 rows)
您必须将数组转换为适当的类型(可能不是 int[])。如果数组不为空,Postgres 将猜测类型,但如果它们为空并且您没有将它们转换为特定类型,它将抛出错误。
我正在尝试获取点列表并查询地理空间数据库,以找到所有匹配的行。
我有一个计算的 SQL 语句,如下所示:
cursor = connection.cursor()
cursor.execute(
'''
SELECT g.ident
FROM (VALUES %s) AS v (lon, lat)
LEFT JOIN customers g
ON (ST_Within(ST_SetSRID(ST_MakePoint(v.lon, v.lat), %s), g.poly_home));
''', [AsIs(formatted_points), SRID]
)
下面是 formatted_points 变量的示例:
(-115.062,38.485), (-96.295,43.771)
因此,当将其插入 SQL 表达式时,VALUES 表达式为:
(VALUES (-115.062,38.485), (-96.295,43.771)) AS v (lon, lat)
到目前为止一切顺利。但是,当点列表为空时,VALUES 表达式如下所示:
(VALUES ) AS v (lon, lat)
.. 这导致我得到这个错误:
django.db.utils.ProgrammingError: syntax error at or near ")"
换句话说,(VALUES )
是不合法的SQL。
问题来了:如何使用 VALUES 表示一个空列表?我可以对这个进行特殊处理,当这个函数传递一个空列表时只是 return 一个空列表,但这看起来不太优雅。
我查看了 PostgreSQL manual page 的 VALUES,但我不明白如何构造一个空的 VALUES 表达式。
如果您可以将 lons 和 lats 放在单独的数组中,则可以使用带有 unnest 的数组:
select * from unnest(ARRAY[1, 2, 3]::int[], ARRAY[4, 5, 6]::int[]) as v(lon, lat);
lon | lat
-----+-----
1 | 4
2 | 5
3 | 6
(3 rows)
select * from unnest(ARRAY[]::int[], ARRAY[]::int[]) as v(lon, lat);
lon | lat
-----+-----
(0 rows)
您必须将数组转换为适当的类型(可能不是 int[])。如果数组不为空,Postgres 将猜测类型,但如果它们为空并且您没有将它们转换为特定类型,它将抛出错误。