Разделенный запятыми список JSON ключей объекта - PullRequest
1 голос
/ 25 марта 2020

В моей таблице Postgres есть столбец varchar , значение которого выглядит следующим образом:

{
    "vars": {
        "props": [{
                "a": "testA1",
                "b": "testB1",
                "c": "testC1"
            },
            {
                "a": null,
                "b": "testB2",
                "c": "testB3"
            }, {
                "a": "testA3",
                "b": "testB3",
                "c": "testC3"
            }
        ]
    }
}

Я хочу получить список всех клавиш "a", которые не равны нулю, а разделяют их запятыми. Это должно выглядеть так:

testA1, testA3

Каков наилучший способ добиться этого?

1 Ответ

1 голос
/ 25 марта 2020

Вот один вариант, который работает, приводя строку к типу данных jsonb, затем расширяя массив 'props' до строк с jsonb_array_elements(), фильтруя ненулевые значения a и агрегируя:

select t.id, string_agg(j.v ->> 'a', ',') vals
from mytable t
cross join lateral jsonb_array_elements( (js::jsonb) -> 'vars' -> 'props') j(v)
where j.v ->> 'a'  is not null
group by t.id

Предполагается, что у вас есть первичный ключ или уникальный столбец, который можно использовать для отслеживания каждой необъявленной записи.

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

with mytable as (
    select 1 id, '{
    "vars": {
        "props": [
            {
                "a": "testA1",
                "b": "testB1",
                "c": "testC1"
            },
            {
                "a": null,
                "b": "testB2",
                "c": "testB3"
            }, {
                "a": "testA3",
                "b": "testB3",
                "c": "testC3"
            }
        ]
    }
}' js
)
select t.id, string_agg(j.v ->> 'a', ',') vals
from mytable t
cross join lateral jsonb_array_elements( (js::jsonb) -> 'vars' -> 'props') j(v)
where j.v ->> 'a'  is not null
group by t.id
id | vals
-: | :------------
 1 | testA1,testA3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...