繁体   English   中英

在postgres中查询json

[英]Querying json in 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)

问题是我不能那样使用它。 我想只捕获“lat”和“lon”的值,将它们放在字段表中

我试图使用函数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.

您可以使用json操纵器操作符->>json_array_elements输出中获取所需的值作为文本。 为了使它更容易,你可以在FROM子句中调用json_array_elements (这是对set- 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到现有的表):

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关键字对于集合返回函数调用是可选的,但你可以使它真正明确,如:

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

此外,LATERAL仅为9.3+,尽管你肯定高于此,因为你使用的是json_array_elements (仅限9.3+)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM