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
Другие вопросы по тегам