#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. Ну, ПОКА. Спасибо