#postgresql #postgresql-11
Вопрос:
У меня есть примеры данных для демострации, как показано ниже:
Стол:
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
Комментарии:
1. @a_horse_with_no_name, Извините меня, на самом деле тип данных предназначен
json
дляjdata
столбца, и данные были сохранены в заданном формате.
Ответ №1:
Вам нужно использовать json_array_elements()
более высокую скорость, чем unnest()
в массиве JSON. Вы можете использовать боковое соединение, чтобы получить самый высокий элемент после этого:
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
Ответ №2:
вам нужно использовать jsonb, здесь я собираюсь отправить вам рекомендации.
https://www.compose.com/articles/faster-operations-with-the-jsonb-data-type-in-postgresql/