有条件地做jsonb_array_elements

时间:2019-05-24 16:11:46

标签: postgresql jsonb

我有一个名为info的jsonb列,其中某些类型具有对象的形式:{ 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 :(得分:0)

使用函数jsonb_typeof()消除具有非数组jsonb列的行:

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

Working example in rextester.