2016-08-25 3 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"} 

が、私は今、私は

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) 

私のデータを照会することができます

それに
create table field(data json); 

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

をこのファイルの内容をコピーしています問題はそれを私のように使うことができないということです。

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_to_recordsetを使用しようとした

フィールドテーブルにそれらを置くために、「緯度」及び「経度」の値のみをキャッチしたいと思いますテキストとして出力する値はjson_array_elementsです。それは簡単に、あなたが(set-returning functionlateral呼び出しです)FROM句でjson_array_elementsを呼び出すことができますようにするには:それと

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); 

を、あなたは簡単なテーブルを作成する(または既存のものにINSERTを使用)することができます

FROM 
    field f 
    CROSS JOIN LATERAL 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は:として、LATERALキーワードは集合を返す関数呼び出しのためのオプションであるようLATERALは、暗黙的存在ですが、あなたはそれが本当に明示的に作ることができます

また、LATERALは9.3+のみですが、あなたがjson_array_elements(9.3+のみ)を使用していることを確かに上回っています。

関連する問題