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
相关产品推荐
相关产品推荐

