2016-08-25 68 views
3

我必須從包含空間信息的json文件中提取數據。這個文件的內容是在postgres中查詢json

{"vertices":[{"lat":46.744628268759314,"lon":6.569952920654968}, 
     {"lat":46.74441692818192,"lon":6.570487107359068}, 
     {"lat":46.74426116111054,"lon":6.570355867853787}, 
     {"lat":46.74447250168793,"lon":6.569821681149689}], 
"name":"demo-field", 
"cropType":"sugarbeet", 
"cropPlantDistance":0.18000000715255737, 
"rowDistance":0.5,"numberOfRows":[28,12,12],"seedingDate":"2016-08-17T07:39+00:00"} 

我創建了一個表,然後複製該文件的內容到它

create table field(data json); 

COPY field(data) FROM '/home/guest-pc5/field.json'; 

我現在我可以查詢我的數據

SELECT json_array_elements(data->'vertices') from field; 
{"lat":46.744628268759314,"lon":6.569952920654968} 
{"lat":46.74441692818192,"lon":6.570487107359068} 
{"lat":46.74426116111054,"lon":6.570355867853787} 
{"lat":46.74447250168793,"lon":6.569821681149689} 
(4 rows) 

的問題是我不能像那樣使用它。我想只捕獲的「緯度」和「經度」值,把他們在場上表

我試圖使用功能json_to_recordset沒有成功

select * from json_to_recordset('[{"lat":46.744628268759314,"lon":6.569952920654968},{"lat":46.74441692818192,"lon":6.570487107359068},{"lat":46.74426116111054,"lon":6.570355867853787},{"lat":46.74447250168793,"lon":6.569821681149689}]') as (lat numeric, lon numeric); 
    ERROR: function json_to_recordset(unknown) does not exist 
    LINE 1: select * from json_to_recordset('[{"lat":46.744628268759314,... 
        ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
+0

這個確切的查詢適用於我在PostgreSQL 9.5 –

回答

1

您可以使用json manipulator operator ->>獲得您想要的值爲json_array_elements輸出的文本。爲了更方便,你可以在FROM條款調用json_array_elements(這是一個lateral呼叫到set-returning function):

SELECT 
    f.data AS original_json, 
    CAST((e.element->>'lat') AS numeric) AS lat, 
    CAST((e.element->>'lon') AS numeric) AS lon 
FROM 
    field AS f, 
    json_array_elements(f.data->'vertices') AS e(element); 

有了這一點,你可以簡單的創建一個表(或使用插入到一個存在的一個):

CREATE TABLE coordinates AS 
SELECT 
    f.data AS original_json, 
    CAST((e.element->>'lat') AS numeric) AS lat, 
    CAST((e.element->>'lon') AS numeric) AS lon 
FROM 
    field AS f, 
    json_array_elements(f.data->'vertices') AS e(element); 

OBS:橫向有隱式的,隨着橫向關鍵字是可選的設置返回函數調用,但你可以使它真正明確的,如:

FROM 
    field f 
    CROSS JOIN LATERAL json_array_elements(f.data->'vertices') AS e(element); 

另外,LATERAL只有9.3+,雖然你肯定高於你使用的json_array_elements(也只有9.3+)。