2012-09-13 81 views
0

我有这样的Postgres/PostGIS的查询:由于转义字符串而导致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中没有与逃脱的问题

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

我运行的Postgres 9.1.5和PostGIS的:数据(for example),和查询从基于Npgsql的这个参数化查询产生2.0.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()预计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,使之清楚,像@保罗在他的评论建议。但它也没有明确演员的作品。

+0

感谢。你是对的 - 我甚至没有关于报价的事情。我使用的pgAdmin III,它的颜色编码显示的数字为不同的颜色,因为报价正在他们面前解开了,我流逝成被返回到我的Visual Studio颜色编码的思想范式,其中的参数有不同的颜色。 –

+0

现在另一个问题:'$$ POINT(' - 96.6864379495382''32 .792527154088')$$'不起作用,但'$$ POINT(-96.6864379495382 32.792527154088)$$'。 (有或没有参数之间的逗号没有区别。)这是因为PostGIS函数不喜欢引用数字吗? –

+1

POINT()不是一个函数它的点的文本字符串表示的一部分。你也必须引用它。 '要点(1 1)' ::几何 –

相关问题