0

私はこのPostgres/PostGISクエリを持っています:

UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(((E'-96.6864379495382')::float8) ((E'32.792527154088')::float8))', 4326),3081)
WHERE id=((10793455)::int4)

実行すると、次のエラーが発生します。

ERROR:  syntax error at or near "')::float8) ((E'"
LINE 2: ...sform(ST_GeomFromText('POINT(((E'-96.6864379495382')::float8...
                                                             ^

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

ERROR: syntax error at or near "')::float8) ((E'"
SQL state: 42601
Character: 94

PostGISにはエスケープされたデータ(たとえば)に問題がなく、クエリはこのパラメータ化されたクエリに基づいてnpgsqlから生成されたため、頭を悩ませています:

UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(:longitude :latitude)', 4326),3081)
WHERE id=:id

Postgres9.1.5とPostGIS2.0.1を実行しています。

4

1 に答える 1

1

このエラーは、文字列内のエスケープされていない一重引用符が原因で発生します。標準的な方法は、それらを2倍にすることです。

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(
               'POINT(((E''-96.6864379495382'')::float8)
                     ((E''32.792527154088'')::float8))', 4326),3081)
WHERE  id=((10793455)::int4)

これにより文字列リテラルが修正されますが、エラーが増えます。
コメントでほのめかされた@Paulのように、ジオメトリWKTST_GeomFromText()を期待します。Postgres関数に入ろうとしているように見せるための明示的なキャスト(最初は混乱していました)。簡略化:POINT(0 0)float8point()

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(
                  $$POINT(96.6864379495382 32.792527154088)$$, 4326), 3081)
WHERE  id = 10793455

また、2番目の例でドル引用符を使用して、一重引用符を完全にエスケープする必要がないようにする方法にも注意してください。構文を修正した後、文字列リテラルに一重引用符が残っていないため、もう一度一重引用符を使用することをお勧めします。パラメータ化されたクエリ:

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(
                  $$POINT(:longitude :latitude)$$::geometry, 4326), 3081)
WHERE  id = :id

geometry@Paulがコメントでアドバイスしているように、キャストを追加して明確にすることができます。ただし、明示的なキャストがなくても機能します。

于 2012-09-13T05:52:29.867 に答える