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

我正在运行 Postgres 9.1.5 和 PostGIS 2.0.1。

4

1 回答 1

1

该错误是由字符串中未转义的单引号引起的。标准方法是将它们加倍:

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 在评论中暗示的那样,ST_GeomFromText()期望几何 WKTPOINT(0 0)。显式强制转换float8使您看起来像是在尝试输入 Postgres 函数point()(起初让我感到困惑)。简化为:

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

另请注意,我如何在第二个示例中使用美元引用来避免完全转义单引号。由于修复语法后字符串文字中没有任何单引号,您不妨再次使用单引号。您的参数化查询:

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 回答