You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 14.9中拆分JSONB数组对象为单独行

PostgreSQL 14.9:展开JSONB数组并筛选指定元素

原表结构与数据

Name (Txt)Detail (JSONB)state (JSONB)
apple[{"code": "156", "color": "red"}, {"code": "156", "color": "blue"}][{"ap": "good", "op2": "bad"}]
orange[{"code": "156", "color": "red"}, {"code": "235", "color": "blue"}][{"op": "bad", "op2": "best"}]
lemon[{"code": "156", "color": "red"}, {"code": "156", "color": "blue"}][{"cp": "best", "op2": "good"}]

期望输出

Name (Txt)Detail (JSONB)state (JSONB)
apple{"code": "156", "color": "red"}{"ap": "good", "op2": "bad"}
apple{"code": "156", "color": "blue"}{"ap": "good", "op2": "bad"}
orange{"code": "156", "color": "red"}{"op": "bad", "op2": "best"}
lemon{"code": "156", "color": "red"}{"cp": "best", "op2": "good"}
lemon{"code": "156", "color": "blue"}{"cp": "best", "op2": "good"}

解决方案

使用jsonb_array_elements展开JSONB数组,同时筛选指定code值的元素,即可得到目标结果。修正后的SQL语句如下:

SELECT
    "Name (Txt)"
 ,  jsonb_build_object('code', elem->>'code', 'color', elem->>'color') AS "Detail (JSONB)"
 ,  state::JSONB 
FROM your_table,
     jsonb_array_elements("Detail (JSONB)") AS elem
WHERE elem->>'code' = '156';

关键逻辑说明

  • jsonb_array_elements("Detail (JSONB)") AS elem:将原字段中的JSONB数组拆分为单行JSON对象,每个对象对应数组中的一个元素。
  • WHERE elem->>'code' = '156':过滤出数组中code字段值为'156'的元素,排除不符合条件的条目。
  • jsonb_build_object:重新构造符合输出格式要求的JSONB对象,保证结构与期望一致。

内容的提问来源于stack exchange,提问作者Makoto Makoto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:05:32