如何在postgresql中只返回JSONB字段中元素的子集

a0zr77ik  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(139)

我在Postgres有一个表,结构如下。
| 身份证|姓名|对象(jsonb)|
| - ------|- ------|- ------|
| 1个|第一|[{"name":"a", value:"1", "param":{}}, {"name":"b", "value":"55", "param":{}}, {"name":"c", "value":"234", "param":{}}]|
| 第二章|秒|[{"name":"b", "value":"22", "param":{}}, {"name":"c", "value":"24", "param":{}}]|
| 三个|三度|[{"name":"c", "value":"345", "param":{}}] ||
| 四个|向前|[{"name":"a", "value":"123", "param":{}}, {"name":"b", "value":"456", "param":{}}]|
我试图编写一个查询,它返回所有行,但只返回"objects"列中对象的子集。
如果我只想要"name"="b"的元素,下面的输出将是答案
| 身份证|姓名|对象(jsonb)|
| - ------|- ------|- ------|
| 1个|第一|[{"name":"b", "value":"55", "param":{}}]|
| 第二章|秒|[{"name":"b", "value":"22", "param":{}}]|
| 三个|三度|[]|
| 四个|向前|[{"name":"b", "value":"456", "param":{}}]|
如果我只需要"name"="b"或"name"="c"的元素,下面的输出将是答案
| 身份证|姓名|对象(jsonb)|
| - ------|- ------|- ------|
| 1个|第一|[{"name":"b", "value":"55", "param":{}}, {"name":"c", "value":"234", "param":{}}]|
| 第二章|秒|[{"name":"b", "value":"22", "param":{}}, {"name":"c", "value":"24", "param":{}}]|
| 三个|三度|[{"name":"c", "value":"345", "param":{}}]|
| 四个|向前|x1米11米1x|

eyh26e7m

eyh26e7m1#

从此处JSON functions使用jsonb_path_query

SELECT
    jsonb_path_query('[{"name":"a", "value":"1", "param":{}}, {"name":"b", "value":"55", "param":{}}, 
{"name":"c", "value":"234", "param":{}}]'::jsonb, '$[*] ? (@.name == "b")');

 jsonb_path_query              
-------------------------------------------
 {"name": "b", "param": {}, "value": "55"}

更新第二例:

SELECT
    jsonb_agg(a)
FROM 
    jsonb_path_query('[{"name":"a", "value":"1", "param":{}}, {"name":"b", "value":"55", "param":{}}, 
{"name":"c", "value":"234", "param":{}}]'::jsonb, '$[*] ? (@.name == "b" || @.name == "c")') AS t (a);

jsonb_agg                                        
-----------------------------------------------------------------------------------------
 [{"name": "b", "param": {}, "value": "55"}, {"name": "c", "param": {}, "value": "234"}]
z3yyvxxp

z3yyvxxp2#

提取元素、过滤器、聚合

select id, name, jsonb_agg(e) objects
from (
   select id, jsonb_array_elements(objects) e
   from mytable ) t
where e::jsonb ->> 'name' = 'b'
group by id, name

相关问题