Postgres JSONB запрос на вложенный объект
Моя версия postgres db: 9.4.4. и у меня есть таблица с этой структурой;
CREATE TABLE product_cust
(
productid character(2),
data jsonb,
)
У меня есть такие записи в столбце "данные";
{"productid":"01","cust": [
{"cell": ["0000xxx0", "0000xxx1"], "name": "John", "email": ["john@email.net"], "custtype": "c"},
{"cell": ["0000xxx2", "0000xxx3"], "name": "Smith", "email": ["smith@email.net"], "custtype": "c"}
]}
Мне нужно извлечь все записи для "ячейки". Ожидаемая запись будет
["0000xxx0", "0000xxx1","0000xxx2", "0000xxx3"]
или для "электронной почты" ["john@email.net","smith@email.net"]
Мое лучшее усилие, приведенное ниже, состояло из двух (2) этапов процесса, и не будет масштабироваться для x нет объектов "cust";
select (data::json#>'{cust,0}')::json#>'{cell}' from product_cust; //return "0000xxx0", "0000xxx1"
select (data::json#>'{cust,1}')::json#>'{cell}' from product_cust; //return "0000xxx2", "0000xxx3"
Я буду очень признателен, если я могу указать в правильном направлении
1 ответ
Решение
Используйте функции json_agg() и jsonb_array_elements():
select json_agg(cell)
from (
select jsonb_array_elements(elem->'cell') cell
from (
select jsonb_array_elements(data->'cust') elem
from product_cust
) subsub
) sub
Вы можете объединить два внутренних подзапроса:
select json_agg(cell)
from (
select jsonb_array_elements(jsonb_array_elements(data->'cust')->'cell') cell
from product_cust
) sub
Группировка результатов по продукту:
select productid, json_agg(cell)
from (
select productid, jsonb_array_elements(jsonb_array_elements(data->'cust')->'cell') cell
from product_cust
) sub
group by 1
order by 1