2016-08-25 3 views
3

Мне нужно извлечь данные из json-файла, который содержит пространственную информацию. Содержание этого файлаQuerying json in postgres

{"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. Для того, чтобы сделать его проще, вы можете позвонить json_array_elements в FROM пункте (который является 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); 

При том, что вы можете просто создать таблицу (или использовать INSERT в несуществующей один):

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 ключевое слово не является обязательным для вызовов функций, возвращающих набор, но вы можете сделать это на самом деле явно, как:

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

Кроме того, LATERAL - только 9.3+, хотя вы, безусловно, выше этого, поскольку используете json_array_elements (также 9.3+).