postgresql - 嵌套查询作为 PostGIS 函数参数

标签 postgresql postgis postgresql-9.1 npgsql subquery

我有一个 PostGIS 查询,我确实需要在 PostGIS 函数调用中嵌套查询:

UPDATE raw.geocoding
SET the_geom = ST_Centroid(
   ST_Collect(
     SELECT the_geom
     FROM raw.geocoding
     WHERE hash = ((E'0101000020090C000081610F9CC5DC3341EE672E6E723B3241')::varchar),
     SELECT the_geom
     FROM raw.geocoding
     WHERE hash = ((E'0101000020090C00002CF887E0C5DC3341C9E5B2DF2A383241')::varchar)
    )
  )
WHERE hash = ((E'3e638a27c6c38f05026252f4a0b57b2e')::varchar)

不幸的是,这不起作用。我在嵌套查询的开头遇到语法错误:

ERROR:  syntax error at or near "SELECT"
LINE 4:          SELECT the_geom
                 ^

********** Error **********

ERROR: syntax error at or near "SELECT"
SQL state: 42601
Character: 86

看起来我不能将嵌套查询作为 PostGIS 函数参数?

我仔细阅读了 PostGIS 文档,但找不到任何明确的指导来处理此问题。

看起来 Postgres 有一种在 pgSQL 中处理变量的方法,但我不清楚如何在标准查询中实现这一点。这是一个将从 C# 程序运行数万或数十万次的查询。除此之外,如果需要,我可以执行 pgSQL 存储过程;只是想首先确保没有更简单的替代方案。

如果您想知道,该查询看起来很困惑,因为它是 npgsql 生成的参数化查询的结果。我认为可以公平地说 npgsql 对于冗余输入和转义非常谨慎。

我正在运行 PostGIS 2.0.1、Postgres 9.1.5 和 npgsql 2.0.12。

最佳答案

听起来你想要一个 scalar subquery ,一种类似于 (SELECT ....)(注意括号)的表达式,其中包含返回零行(NULL 结果)或一行中的一个字段的查询。

你已经完成了大部分工作,你只需要括号:

UPDATE raw.geocoding
SET the_geom = ST_Centroid(
   ST_Collect(
     (SELECT the_geom
     FROM raw.geocoding
     WHERE hash = ((E'0101000020090C000081610F9CC5DC3341EE672E6E723B3241')::varchar)),
     (SELECT the_geom
     FROM raw.geocoding
     WHERE hash = ((E'0101000020090C00002CF887E0C5DC3341C9E5B2DF2A383241')::varchar))
    )
  )
WHERE hash = ((E'3e638a27c6c38f05026252f4a0b57b2e')::varchar)

请注意,子查询也可以在其他地方使用 - 例如,返回子查询的表可以出现在 FROM 中。 PostgreSQL manual教授了所有这些内容,非常值得从头到尾阅读。

如果您正在进行大量此类更新,您可能会发现使用 PostgreSQL 扩展 UPDATE ... FROM ... WHERE 将 UPDATE 制定为联接会更有效 而不是一遍又一遍地运行大量单独的 UPDATE。我只是想提出可能性。请参阅from-list in UPDATE

关于postgresql - 嵌套查询作为 PostGIS 函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452533/

相关文章:

postgresql - 如何在 PostgreSQL 上启用审计跟踪

database - 如何将几何数据类型用于 postgres 表?

python - .execute ('INSERT ...' ) 实际上并没有往表中插入数据

postgresql - 为什么在查询结果中查询会产生重复记录

postgresql - postgres lag 有类型但行没有。为什么?

kml - Postgis 到 KML,包括色域

python - 数据装箱 : irregular polygons to regular mesh

sql - 在 postgreSQL 查询的 where 子句中使用文本文件

python - Django+Postgres FATAL : sorry, 客户端已经太多了

postgresql-13-postgis-3 : Depends: libgdal20 (>= 2. 0.1) 但它不会被安装