由于转义字符串,PostGIS查询失败?

时间:2012-09-13 03:09:50

标签: sql postgresql postgis npgsql query-parameters

我有这个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对转义数据(for example)没有问题,并且查询是根据此参数化查询从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。

1 个答案:

答案 0 :(得分: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()期待geometry WKT POINT(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

另请注意,我如何在第二个示例中使用dollar quoting以避免必须完全转义单引号。由于修复语法后字符串文字中没有任何单引号,因此您也可以再次使用单引号。您的参数化查询:

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

你可以添加一个强制转换为geometry来清楚地表达,就像@Paul在他的评论中所建议的那样。但它也没有明确的演员。