Как выполнять запросы на основе максимального размера атрибута в массиве объектов JSON

#sql #arrays #json #postgresql

#sql #массивы #json #postgresql

Вопрос:

Я пытаюсь создать запрос на основе тела JSON, которое содержит атрибут в массиве, который является плавающим. Этот массив объектов JSON может содержать несколько индексов, но у меня возникают проблемы с получением самого большого атрибута и связанного с ним. Как мне получить правильный индекс массива на основе поля «дата»?

Я пытался выполнить ПОПЕРЕЧНЫЙ оператор ПЕРЕКРЕСТНОГО СОЕДИНЕНИЯ, который сортирует в порядке убывания и ограничивает на 1, но в этой базе данных есть несколько строк, к которым необходимо выполнить запрос. Структура JSON:

 {
"identification":"123a",
"array": [
   {
     "type":"created",
     "num": 123.45
   },
   {
     "type":"delete",
     "num": 123.46
   }
   ]
}
 

Пока что мой запрос выглядит следующим образом:

 SELECT col -> 'identification' AS Identify FROM tbl t
CROSS JOIN LATERAL jsonb_array_elements(t.col -> 'array') jae (array)
ORDER BY jae.array -> 'num' DESC
 

Я хочу, чтобы результат был возвращен полностью в формате JSON, включая атрибут ‘identification’. Наибольшее число для атрибута ‘num’ в массиве, наряду с другими атрибутами этого объекта, должно быть возвращено вместе с идентификатором. Это вроде как работает, но я вижу, что запрос возвращает все объекты массива. Результат запроса должен выглядеть следующим образом

 {
"Identify":"123a"
   "array":{
      "type":"delete",
      "num": 123.46
}
}
 

В результате должен быть опущен тип объекта «созданный» и возвращены только атрибуты, основанные на максимальном размере атрибута «num».

Ответ №1:

Это должно сделать это:

 SELECT json_build_object('Identify', t.col -> 'identification', 'array', x.elem)
FROM   tbl t
CROSS  JOIN LATERAL (
   SELECT a.elem
   FROM   jsonb_array_elements(t.col -> 'array') a(elem)
   ORDER  BY a.elem -> 'num' DESC NULLS LAST
   LIMIT  1
   ) x;
 

db<>скрипка здесь

ВОЗВРАТ json . Вместо этого вы можете захотеть jsonb .

Комментарии:

1. Что здесь делает псевдоним a(elem)?

2. @JoshHale: объявляет псевдоним таблицы и столбца. Полезно для более сложных случаев, например, для добавления ординальности. Для простого случая мы могли бы использовать краткий синтаксис, но я предпочитаю быть явным. jsonb_array_elements() (как и некоторые другие функции json) предоставляет свои собственные имена столбцов результатов — value в данном случае — которые могут использоваться, если не указано иное.

3. Ну, ПОКА. Спасибо