2012-09-13 83 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)' ::幾何 –

相關問題