嵌套查询为PostGIS函数参数

时间:2012-09-17 02:34:59

标签: postgresql postgis postgresql-9.1 npgsql nested-query

我有一个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。

1 个答案:

答案 0 :(得分:3)

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

你大部分都在那里,你只需要parens:

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扩展UPDATEUPDATE ... FROM ... WHERE表示为联接更有效,而不是运行大量个人UPDATE一遍又一遍。我只想提高可能性。见from-list in UPDATE