如何从PostgreSQL的JSONB字段中仅返回元素子集
PostgreSQL 筛选JSONB数组中的指定对象
我在PostgreSQL中有一张表,结构及数据如下:
| id | name | objects(jsonb) |
|---|---|---|
| 1 | first | [{"name":"a", "value":"1", "param":{}}, {"name":"b", "value":"55", "param":{}}, {"name":"c", "value":"234", "param":{}}] |
| 2 | second | [{"name":"b", "value":"22", "param":{}}, {"name":"c", "value":"24", "param":{}}] |
| 3 | third | [{"name":"c", "value":"345", "param":{}}] |
| 4 | forth | [{"name":"a", "value":"123", "param":{}}, {"name":"b", "value":"456", "param":{}}] |
需要编写查询语句返回表中所有行,但仅保留objects列里符合指定条件的对象子集。
场景1:仅筛选name="b"的元素
预期输出:
| id | name | objects(jsonb) |
|---|---|---|
| 1 | first | [{"name":"b", "value":"55", "param":{}}] |
| 2 | second | [{"name":"b", "value":"22", "param":{}}] |
| 3 | third | [] |
| 4 | forth | [{"name":"b", "value":"456", "param":{}}] |
场景2:筛选name="b"或name="c"的元素
预期输出:
| id | name | objects(jsonb) |
|---|---|---|
| 1 | first | [{"name":"b", "value":"55", "param":{}}, {"name":"c", "value":"234", "param":{}}] |
| 2 | second | [{"name":"b", "value":"22", "param":{}}, {"name":"c", "value":"24", "param":{}}] |
| 3 | third | [{"name":"c", "value":"345", "param":{}}] |
| 4 | forth | [{"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
相关产品推荐
相关产品推荐

