Вот один вариант, который работает, приводя строку к типу данных 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