Получить элемент json из массива JSON

#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/