Как извлечь элементы из массива JSONB? - PullRequest
0 голосов
/ 19 сентября 2018

Запуск 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"

1 Ответ

0 голосов
/ 19 сентября 2018

Используйте 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)

Рабочий пример в rextester.

...