Запуск PostgresSQL v10.5.
В моей таблице table_a есть столбец metadata типа jsonb.
Он имеет массив JSON в качестве одного из ключей array_key со значением примерно так:
[{"key1":"value11", "key2":"value21", "key3":"value31"},
{"key1":"value21", "key2":"value22", "key3":"value23"}]
Вот как я могу запросить этот ключ
SELECT metadata->>'array_key' from table_a
Это дает мне весь массив. Есть ли способ запросить только выбранные ключи и, возможно, отформатировать их?
Тип массива - текст, то есть pg_typeof(metadata->>'array_key') - это text.
Идеальный выход был бы
"value11, value13", "value21, value23"





Используйте jsonb_array_elements() для получения элементов массива (как value), которые можно фильтровать по ключам:
select value->>'key1' as key1, value->>'key3' as key3
from table_a
cross join jsonb_array_elements(metadata->'array_key');
key1 | key3
---------+---------
value11 | value31
value21 | value23
(2 rows)
Используйте агрегат, чтобы получить вывод как одно значение для каждой строки, например:
select string_agg(concat_ws(', ', value->>'key1', value->>'key3'), '; ')
from table_a
cross join jsonb_array_elements(metadata->'array_key')
group by id;
string_agg
------------------------------------
value11, value31; value21, value23
(1 row)