【问题标题】:PostgreSQL empty list VALUES expressionPostgreSQL 空列表 VALUES 表达式
【发布时间】:2019-07-09 16:59:09
【问题描述】:

我正在尝试获取点列表并查询地理空间数据库,以查找所有匹配的行。

我有一个如下所示的计算 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 表示一个空列表?我可以特例,当这个函数被传递一个空列表时只返回一个空列表,但这似乎不是很优雅。

我查看了PostgreSQL manual page 的 VALUES,但我不明白如何构造一个空的 VALUES 表达式。

【问题讨论】:

    标签: django python-3.x postgresql psycopg2


    【解决方案1】:

    如果你可以将你的 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 会猜测类型,但如果它们为空并且您没有将它们转换为特定类型,则会抛出错误。

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      相关资源
      最近更新 更多