从 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