2

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、およびnpgsql2.0.12を実行しています。

4

1 に答える 1

3

スカラーサブクエリが必要なようです。これ(SELECT ....)は、ゼロ行(NULL結果)または1行から1フィールドのいずれかを返すクエリを含む(括弧で囲むことに注意してください)のような式です。

あなたはほとんどそこにいました、あなたはただ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のマニュアルはこれらすべてについて教えており、カバーツーカバーで読む価値があります。

これらの更新を多数実行している場合は、多数の個別のを何度も実行するよりもUPDATE、PostgreSQL拡張機能を使用して結合としてを定式化する方が効率的である場合があります。可能性を高めたかっただけです。のリストから参照してくださいUPDATE ... FROM ... WHEREUPDATEUPDATE

于 2012-09-17T02:45:29.697 に答える