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

PostgreSQL 14.9中如何关联两列JSONB数组后查询指定结果?

PostgreSQL 14.9 JSONB数组关联查询解决方案

表结构(a_table)

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

预期查询结果

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

错误尝试的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,
     state::JSONB
WHERE elem->>'code' = '156';

正确SQL语句

SELECT
    t."Name (Txt)",
    elem AS "Detail (JSONB)",
    state_elem AS "state (JSONB)"
FROM a_table t
CROSS JOIN jsonb_array_elements(t."Detail (JSONB)") AS elem
LEFT JOIN jsonb_array_elements(t."state (JSONB)") AS state_elem
    ON elem->>'color' = state_elem->>'color'
WHERE elem->>'code' = '156';

关键说明

  1. 用CROSS JOIN jsonb_array_elements展开Detail数组,筛选出code为156的条目
  2. 通过LEFT JOIN关联state数组元素,匹配条件为两个JSONB对象的color字段一致,保证无对应state的条目显示为空
  3. 直接复用展开后的elem作为Detail字段,无需重新构建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:13:22