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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:48:18