我有这个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。
答案 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在他的评论中所建议的那样。但它也没有明确的演员。