PostgreSQL中如何将JSONB对象数组合并为单个JSONB对象
PostgreSQL 合并JSONB数组内对象为单个对象方案
coalesce函数仅用于返回参数列表中第一个非NULL值,本身不具备JSON结构合并能力,因此无法实现你的需求,可通过以下方案实现:
方案1:原生函数实现(无额外依赖,兼容所有支持JSONB的PostgreSQL版本)
核心逻辑是先拆分数组为独立对象,展开所有键值对后重新聚合为单个对象,示例代码:
-- 表查询示例 SELECT ( SELECT jsonb_object_agg(key, val) FROM jsonb_array_elements(your_jsonb_column) AS single_obj, jsonb_each(single_obj) AS kv(key, val) ) AS merged_result FROM your_table;
逻辑说明:
jsonb_array_elements:将JSONB数组中的每一个对象拆分为独立行jsonb_each:将拆分出的每个对象展开为键、值的二元组jsonb_object_agg:将所有键值对重新聚合为单个JSONB对象
注意:如果数组内不同对象存在重复键,排序靠后的对象的键值会覆盖靠前的同键值。
可以直接用示例数据验证效果:
WITH demo AS (SELECT '[{"a": 1}, {"b": 2}, {"c": 0.5}]'::jsonb AS arr) SELECT ( SELECT jsonb_object_agg(k, v) FROM jsonb_array_elements(arr), jsonb_each(value) AS t(k,v) ) FROM demo; -- 返回结果:{"a": 1, "b": 2, "c": 0.5}
方案2:自定义聚合函数(写法更简洁,支持PostgreSQL 9.5及以上版本)
如果这类合并操作使用频繁,可以提前创建专门的JSONB合并聚合函数,后续查询直接调用即可:
-- 一次性创建聚合函数 CREATE AGGREGATE jsonb_merge_agg(jsonb) ( SFUNC = jsonb_concat, STYPE = jsonb, INITCOND = '{}' ); -- 日常查询写法 SELECT jsonb_merge_agg(single_obj) AS merged_result FROM your_table, jsonb_array_elements(your_jsonb_column) AS single_obj;
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

