Получить элементы как плоскую строку из массива jsonb в postgresql

У меня есть столбец x с типом данных jsonb

и значения выглядят так:

[
{"key": "6cd", "type": "text1", "label": "label_text_1", "content": "description"},
{"key": "815", "type": "text2", "label": "label_text_2", "content": "desc2"}
]

Как вернуть массив строк, содержащий все элементы, с помощью запроса Postgres?

Что-то вроде этого:

[«6cd», «text1», «label_text_1», «description», «815», «text2», «label_text_2», «desc2»]


person Mo Halem    schedule 26.09.2018    source источник


Ответы (1)


Используйте jsonb_array_elements(json_column) для получения элементов массива и jsonb_each_text(elem) для получения значений всех вложенных объектов в этих элементах:

with my_table(id, json_column) as (
values(
    1, 
    '[
        {"key": "6cd", "type": "text1", "label": "label_text_1", "content": "description"},
        {"key": "815", "type": "text2", "label": "label_text_2", "content": "desc2"}
    ]'::jsonb)
)

select id, array_agg(val)
from my_table
cross join jsonb_array_elements(json_column) as a(elem)
cross join jsonb_each_text(elem) as e(key, val)
group by id

 id |                             array_agg                             
----+-------------------------------------------------------------------
  1 | {6cd,text1,label_text_1,description,815,text2,label_text_2,desc2}
(1 row) 
person klin    schedule 26.09.2018
comment
что вы думаете о производительности, если у меня много json_column в большом запросе соединения между таблицами, к которым я хочу применить вашу идею? - person Mo Halem; 27.09.2018
comment
Трудно сказать, потому что много и большой - понятия относительные. В общем, вам следует избегать динамической декомпозиции json-документов, поскольку это всегда дорого. Вам лучше нормализовать свои таблицы, если они будут большими. - person klin; 27.09.2018