PostgreSQL中unnest处理jsonb数组报错42883的解决方法
PostgreSQL jsonb数组拆分解决方案
报错原因
unnest()函数仅支持PostgreSQL原生数组类型(如int[]),不直接处理jsonb数组,所以会抛出function unnest(jsonb) does not exist错误。
方案1:将jsonb数组拆分为多行(对应你原语句的需求)
有两种写法:
- 用jsonb专用的数组展开函数:
select id, modified, jsonb_array_elements_text(fee_rule_id)::int as fee_id from final_data;
jsonb_array_elements_text()会把jsonb数组的每个元素以文本形式取出,再加::int转成整数类型(匹配你的示例数字值)。
- 先将jsonb转成原生int数组,再用
unnest:
select id, modified, unnest(fee_rule_id::text::int[]) as fee_id from final_data;
先把jsonb数组转成文本格式,再转成PostgreSQL原生的int[]数组,就能用unnest展开了。
方案2:将jsonb数组拆分为独立列(你的核心需求)
如果数组长度固定为3,直接通过jsonb索引取值即可(jsonb数组索引从0开始):
select id, modified, (fee_rule_id->>0)::int as column1, (fee_rule_id->>1)::int as column2, (fee_rule_id->>2)::int as column3 from final_data;
如果存在数组元素不足3个的情况,用coalesce补默认值(比如null或0):
select id, modified, coalesce((fee_rule_id->>0)::int, null) as column1, coalesce((fee_rule_id->>1)::int, null) as column2, coalesce((fee_rule_id->>2)::int, null) as column3 from final_data;
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

