Как создать SQL-запрос для сортировки массива JSON по 1 атрибуту? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть таблица со столбцом, который содержит тело JSON с массивами, которые я хочу отсортировать на основе атрибута, связанного с этим массивом.

Я попытался выбрать имя массива и отобразить атрибут, которыйотобразит весь массив

Имя столбца my_column, а JSON отформатирован следующим образом -


{
    "num": "123",
    "Y/N": "Y",
    "array1":[
         {
             "name": "Bob",
             "sortNum": 123
         },
         {
             "name": "Tim Horton",
             "sortNum": 456
         }
    ]
}

Я хочу, чтобы вывод основывался на максимальном значении sortNumпоэтому запрос должен отображать атрибуты Тима Хортона.Код, с которым я играл, приведен ниже, но при попытке выполнить запрос на основе sortNum выдается ошибка.

SELECT my_column 
FROM 
    my_table,
    jsonb_array_elements(my_column->'array1') elem
WHERE elem->>'sortNum' = INT

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Порядок по полю 'sortNum' элемента массива по убыванию и использование LIMIT 1 только для получения верхней записи.

SELECT jae.e
       FROM my_table t
            CROSS JOIN LATERAL jsonb_array_elements(t.my_column->'array1') jae (e)
       ORDER BY jae.e->'sortNum' DESC
       LIMIT 1;

Edit:

Если вы хотите отсортировать численно, а не лексикографически, возьмите элемент в виде текста и приведите его к целому числу перед сортировкой по нему.

SELECT jae.e
       FROM my_table t
            CROSS JOIN LATERAL jsonb_array_elements(t.my_column->'array1') jae (e)
       ORDER BY (jae.e->>'sortNum')::integer DESC
       LIMIT 1;
0 голосов
/ 05 апреля 2019

В этом ответе предполагается, что в вашей таблице есть столбец (или, возможно, комбинация столбцов), который можно использовать для уникальной идентификации записи. Давайте назовем это myid.

Для начала, мы можем использовать json_array_elements, чтобы разбить массив JSON на строки следующим образом:

select myid, x.value, x->>'sortNum' 
from 
    mytable, 
    json_array_elements(mycolumn->'array1') x
;

Возвращает:

myid  |  value                                 | sortnum
---------------------------------------------------------
1     |   {"name":"Bob","sortNum":123}         | 123
1     |   {"name":"Tim Horton","sortNum":456}  | 456

Теперь мы можем превратить это в подзапрос и использовать ROW_NUMBER() для фильтрации элемента массива с самым высоким атрибутом sortNum:

select value
from (
    select 
        x.value, 
        row_number() over(partition by myid order by x->>'sortNum' desc) rn
    from 
        mytable, 
        json_array_elements(mycolumn->'array1') x
) y 
where rn = 1;

Урожайность:

value
-----------------------------------
{"name":"Tim Horton","sortNum":456}

Демонстрация на DB Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...