有条件地做 jsonb_array_elements

Conditionally do jsonb_array_elements

我有一个名为 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 中是否有一种方法可以让交叉连接横向忽略 info 列中不是数组的行?

使用函数jsonb_typeof()消除jsonb列为non-array的行:

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

Working example in rextester.