在 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"}
我创建了一个 table 然后将此文件的内容复制到其中
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" 的值,将它们放在 table
字段中
我尝试使用函数 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 manipulator operator ->>
to get the value you want as text out of json_array_elements
output. To make it easier, you can call json_array_elements
in FROM
clause (which is a lateral call to a 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);
有了它,您可以简单地创建一个 table(或使用 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+)时肯定高于该版本。
我必须从包含空间信息的 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"}
我创建了一个 table 然后将此文件的内容复制到其中
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" 的值,将它们放在 table
字段中我尝试使用函数 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 manipulator operator ->>
to get the value you want as text out of json_array_elements
output. To make it easier, you can call json_array_elements
in FROM
clause (which is a lateral call to a 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);
有了它,您可以简单地创建一个 table(或使用 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+)时肯定高于该版本。