从 JSON 数组中获取 json 元素
Get json element from JSON Array
我有演示的示例数据如下:
Table:
create table tbl_jdata
(
id int,
jdata json
);
insert into tbl_jdata values(1,'[{"salary":10000,"name":"mak"},{"salary":20000,"name":"jak"},{"salary":45000,"name":"abc"}]');
我只想显示一个 json 元素,该元素的薪水最高,例如预期结果如下所示。
预期结果:
id jdata
-------------------------------------
1 [{"salary":45000,"name":"abc"}]
我的尝试:
select t.id,each_section
from tbl_jdata t
cross join unnest(t.jdata) each_section
where t.id = 1 and (each_section ->> 'salary') in
(
select max(each_section ->> 'salary')
from tbl_jdata t
cross join unnest(t.jdata) each_section
);
出现错误:
ERROR: function unnest(json) does not exist
你需要用到jsonb,这里给你发个参考资料
https://www.compose.com/articles/faster-operations-with-the-jsonb-data-type-in-postgresql/
您需要在 JSON 数组上使用 json_array_elements()
评分器而不是 unnest()
。您可以在执行此操作后使用横向连接来获取最高元素:
select t.id, i.*
from the_table t
cross join lateral (
select x.item
from json_array_elements(t.jdata) as x(item)
order by (x.item ->> 'salary')::int desc
limit 1
) i
请注意,建议使用 jsonb
而不是 json
我有演示的示例数据如下:
Table:
create table tbl_jdata
(
id int,
jdata json
);
insert into tbl_jdata values(1,'[{"salary":10000,"name":"mak"},{"salary":20000,"name":"jak"},{"salary":45000,"name":"abc"}]');
我只想显示一个 json 元素,该元素的薪水最高,例如预期结果如下所示。
预期结果:
id jdata
-------------------------------------
1 [{"salary":45000,"name":"abc"}]
我的尝试:
select t.id,each_section
from tbl_jdata t
cross join unnest(t.jdata) each_section
where t.id = 1 and (each_section ->> 'salary') in
(
select max(each_section ->> 'salary')
from tbl_jdata t
cross join unnest(t.jdata) each_section
);
出现错误:
ERROR: function unnest(json) does not exist
你需要用到jsonb,这里给你发个参考资料
https://www.compose.com/articles/faster-operations-with-the-jsonb-data-type-in-postgresql/
您需要在 JSON 数组上使用 json_array_elements()
评分器而不是 unnest()
。您可以在执行此操作后使用横向连接来获取最高元素:
select t.id, i.*
from the_table t
cross join lateral (
select x.item
from json_array_elements(t.jdata) as x(item)
order by (x.item ->> 'salary')::int desc
limit 1
) i
请注意,建议使用 jsonb
而不是 json