Условно делай jsonb_array_elements - PullRequest
1 голос
/ 24 мая 2019

У меня есть столбец jsonb с именем info, который некоторого типа имеет форму объекта: { id: 2 }

и некоторые другие типы имеют форму массива: [{ id: 2 }]

У меня есть запрос, который делает это:

SELECT * FROM users
CROSS JOIN LATERAL jsonb_array_elements(users.info)

Теперь, если у моего набора данных есть только массивы в столбце info, проблема не возникает, но если есть набор, который не является массивом, а скорее объектом, я получаю ошибку:

ERROR: cannot extract elements from an object

Есть ли способ в PostgreSQL для этого CROSS JOIN LATERAL игнорировать строки, которые не являются массивами в столбце info?

1 Ответ

0 голосов
/ 24 мая 2019

Используйте функцию jsonb_typeof(), чтобы исключить строки со столбцом jsonb без массива:

select *
from (
    select *
    from users
    where jsonb_typeof(info) = 'array'
    ) s
cross join lateral jsonb_array_elements(info);

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

...