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

如何从PostgreSQL的JSONB字段中仅返回元素子集

PostgreSQL 筛选JSONB数组中的指定对象

我在PostgreSQL中有一张表,结构及数据如下:

idnameobjects(jsonb)
1first[{"name":"a", "value":"1", "param":{}}, {"name":"b", "value":"55", "param":{}}, {"name":"c", "value":"234", "param":{}}]
2second[{"name":"b", "value":"22", "param":{}}, {"name":"c", "value":"24", "param":{}}]
3third[{"name":"c", "value":"345", "param":{}}]
4forth[{"name":"a", "value":"123", "param":{}}, {"name":"b", "value":"456", "param":{}}]

需要编写查询语句返回表中所有行,但仅保留objects列里符合指定条件的对象子集。


场景1:仅筛选name="b"的元素

预期输出:

idnameobjects(jsonb)
1first[{"name":"b", "value":"55", "param":{}}]
2second[{"name":"b", "value":"22", "param":{}}]
3third[]
4forth[{"name":"b", "value":"456", "param":{}}]

场景2:筛选name="b"或name="c"的元素

预期输出:

idnameobjects(jsonb)
1first[{"name":"b", "value":"55", "param":{}}, {"name":"c", "value":"234", "param":{}}]
2second[{"name":"b", "value":"22", "param":{}}, {"name":"c", "value":"24", "param":{}}]
3third[{"name":"c", "value":"345", "param":{}}]
4forth[{"name":"b", "value":"456", "param":{}}]

解决方案

场景1查询语句

SELECT 
    id,
    name,
    jsonb_agg(obj) FILTER (WHERE obj->>'name' = 'b') AS objects
FROM 
    your_table,
    jsonb_array_elements(objects) AS obj
GROUP BY 
    id, name;

场景2查询语句

SELECT 
    id,
    name,
    jsonb_agg(obj) FILTER (WHERE obj->>'name' IN ('b', 'c')) AS objects
FROM 
    your_table,
    jsonb_array_elements(objects) AS obj
GROUP BY 
    id, name;

关键说明

  • jsonb_array_elements(objects):将JSONB数组拆分为单个对象的行;
  • FILTER子句:精准筛选符合条件的对象;
  • jsonb_agg(obj):将筛选后的对象重新聚合成JSONB数组,无符合条件对象时自动返回空数组[],完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:31:02