2014-07-18 53 views
14

我想下面的查詢:如何轉換的PostgreSQL 9.4的jsonb型浮動

SELECT (json_data->'position'->'lat') + 1.0 AS lat FROM updates LIMIT 5; 

(+1.0的僅僅是有強制轉換爲float我的實際查詢要複雜得多,此查詢只是一個測試案例的問題)

我得到的錯誤:

ERROR: operator does not exist: jsonb + numeric 

如果我添加顯式鑄造:

SELECT (json_data->'position'->'lat')::float + 1.0 AS lat FROM updates LIMIT 5; 

誤差變:

ERROR: operator does not exist: jsonb + double precesion 

據我所知,大多數jsonb值不能被澆鑄成漂浮,但在這種情況下,我知道拉特都是JSON號碼。

是否有一個函數,將jsonb值轉換爲浮點數(或返回不可轉換的NULL值)?

+0

有沒有'默認情況下,Postgres的try_cast'功能。你需要自己寫。 –

回答

38

有兩種操作,從JSON獲得價值。第一個->將返回JSON。第二個->>將返回文本。

詳細說明:JSON Functions and Operators

嘗試

SELECT (json_data->'position'->>'lat')::float + 1.0 AS lat 
FROM updates 
LIMIT 5 
+0

可能你不想亂用值,所以使用:: float + 0.0 AS lat,1 lat變化非常大! –

3

AFAIK沒有json->漂浮在Postgres的鑄造,所以你可以嘗試一個明確的(json_data->'position'->'lat')::text::float

5

Per documentation,也有功能

jsonb_populate_record() 
jsonb_populate_recordset() 

模擬到他們的JSON雙胞胎(因爲PG 9.3本)

json_populate_record() 
json_populate_recordset() 

您需要預定義的行類型。使用現有表的行類型或使用CREATE TYPE定義一個表。或者用臨時表替換:

CREATE TEMP TABLE x(lat float);

可以是單列或長列列。

只有那些中填入,其中json對象匹配的關鍵被強制到類型列,並且必須兼容或引發異常。其他鍵被忽略。

SELECT lat + 1 -- no need for 1.0, this is float already 
FROM updates u 
    , jsonb_populate_record(NULL::x, u.json_data->'position') 
LIMIT 5; 

在這裏使用implicit LATERAL JOIN

同樣,使用jsonb_populate_recordset()將數組分解爲每個條目多行。

這在Postgres 9中的工作方式相同。3與json。對於jsonb中的數字數據,在內部投射/從text不需要額外的好處。

0

您必須將json值轉換爲文本然後浮動。

試試這個:

(json_data #>> '{field}')::float