PostgreSQL中如何提取JSONB数组所有指定字段的值?
解决方法
方法1:展开数组后聚合
你可以用jsonb_array_elements函数把数组拆分成单个JSON对象,提取每个对象的age值后再聚合为数组:
如果要得到PostgreSQL原生数组格式({10,20}):
SELECT array_agg((elem ->> 'age')::integer) AS ages FROM jsonb_array_elements('{"a": [{"age":10},{"age":20}]}'::jsonb -> 'a') AS elem;
如果要得到JSON数组格式([10,20],和你期望的结果一致):
SELECT json_agg(elem -> 'age') AS ages FROM jsonb_array_elements('{"a": [{"age":10},{"age":20}]}'::jsonb -> 'a') AS elem;
方法2:使用JSON路径查询(PostgreSQL 12+)
从PostgreSQL 12开始支持JSON路径查询,用jsonb_path_query_array可以直接提取数组中所有匹配路径的值,写法更简洁:
SELECT jsonb_path_query_array('{"a": [{"age":10},{"age":20}]}'::jsonb, '$.a[*].age');
这条语句会直接返回[10,20],完全符合你的需求。
为什么*运算符不生效?
PostgreSQL的->运算符只支持明确的键名或数组索引,不支持通配符匹配。要实现批量提取,必须借助专门的JSON处理函数(比如jsonb_array_elements)或者JSON路径语法([*]通配符在路径查询中是支持的)。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

