postgresql PostGIS查询因转义字符串而失败?

ruarlubt  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(219)

我有这个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。

ippsafx7

ippsafx71#

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

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()需要几何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

还要注意,我在第二个例子中是如何使用美元引号来避免对单引号进行转义的。由于在修改语法后,字符串文字中没有任何单引号,因此您还可以再次使用单引号。您的参数化查询:

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

你可以给geometry添加一个强制类型来使它更清晰,就像@Paul在他的评论中建议的那样。

相关问题