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

PostgreSQL 15如何将两个JSON对象合并为单个JSON对象?

解决方案

你可以通过两种方式实现需求,推荐优先使用单查询直接生成目标JSON的方式,性能更优;如果需要基于已有两个查询结果合并,也可以利用PostgreSQL的jsonb对象合并特性。

方案一:单查询直接生成完整JSON(推荐)

直接关联category和product表,一次性构造包含分类信息和对应商品数组的JSON对象:

SELECT to_jsonb(c) || jsonb_build_object('products', json_agg(p)) AS merged_json
FROM category c
LEFT JOIN product p ON p.category_id = c.id
WHERE c.id = 43
GROUP BY c;

如果需要严格控制返回的字段(避免冗余),也可以显式指定字段构造:

SELECT jsonb_build_object(
    'id', c.id,
    'name', c.name,
    'description', c.description,
    'products', json_agg(p)
) AS merged_json
FROM category c
LEFT JOIN product p ON p.category_id = c.id
WHERE c.id = 43
GROUP BY c.id, c.name, c.description;

方案二:基于已有两个查询结果合并

如果必须保留原有的两个查询逻辑,可通过CTE获取两个JSON结果,再转为jsonb类型后合并(jsonb的||运算符会合并对象键值对,而非拼接数组):

WITH category_json AS (
    SELECT to_jsonb(T) AS cat_obj
    FROM (SELECT * FROM category WHERE id = 43) T
),
products_json AS (
    SELECT json_build_object('products', JSON_AGG(T))::jsonb AS prod_obj
    FROM (SELECT * FROM product WHERE category_id = 43) T
)
SELECT cat_obj || prod_obj AS merged_json
FROM category_json, products_json;

关键说明

你之前用||得到数组是因为使用了json类型而非jsonb类型:

  • json类型的||运算符作用是拼接数组
  • jsonb类型的||运算符作用是合并对象,这正是你需要的效果

内容的提问来源于stack exchange,提问作者user1107173

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:52:13