pgsql中主子表数据使用json_agg和json_build_object汇聚

本文介绍了一种使用json_build_object和json_agg函数将多条记录聚合为单一JSON对象的方法,解决了前端展示时需要将多个相关联的数据库记录整合为一条数据的需求。

        在实际的业务场景中,我们会经常遇到主从关系的数据,所以相应的数据库层面,我们会根据需要把表设置成主子表的形式,方便存储数据,这就导致了另一个问题,比如查询数据,主子表关联的时候,数据会变成多条,但是使用方(比如手机端、前端)希望是返回一条数据,而且他们需要的还不止一个字段,如果是一个字段,我反手就整个array_to_string(ARRAY_AGG(column_name::VARCHAR),',') as return_name 给处理了,只能另想办法,我第一时间想到了我以前写的一篇博客(感兴趣的小伙伴可以点此处去看看),内心狂喜,能copy的代码,我是一点都不想写,当我把那段代码copy到我现在项目中的时候,发现有个标签在当前项目使用的mybatis版本中不支持,内心瞬间拔凉拔凉,好在像我这样的摸鱼者,肯定还有plan B,这就是我今天要介绍的json_build_object。

        国际惯例,直接上代码:

SELECT
	dm.ds_id,--关联主表的字段
	json_agg(
		json_build_object(
			'rule_name','名称',-- 部分需要写死的返回数据
			'column_id',id::VARCHAR,--前面是json的key(key自己定义),后面是vlue(具体要取的表字段值)
			'type',type,
			'operator', operator
		)
	) AS children_data  -- json_agg 最后组装成数组
	FROM kenvueotc_display_metric dm
	WHERE dm.status = '1' --可以放过滤条件
	GROUP BY
PostgreSQL 中,`jsonb_object_agg` 函数本身是聚合函数,它会根据分组将多个键值对聚合成一个 JSONB 对象。若要在使用该函数时不覆盖已有数据,可借助 `jsonb_merge_patch` 或 `||` 操作符来合并新生成的 JSONB 对象与已有数据。 ### 使用 `jsonb_merge_patch` 函数 `jsonb_merge_patch` 函数能合并两个 JSONB 对象,当键冲突时,会保留两者的值。 ```sql -- 假设有一个表 existing_data 存储已有 JSONB 数据,以及一个表 new_data 存储新的键值对 -- 首先将新数据聚合为 JSONB 对象 WITH new_aggregated AS ( SELECT group_column, jsonb_object_agg(key_column, value_column) AS new_json FROM new_data GROUP BY group_column ) -- 然后将新聚合的 JSONB 对象与已有数据合并 SELECT ed.id, jsonb_merge_patch(ed.json_column, na.new_json) AS merged_json FROM existing_data ed JOIN new_aggregated na ON ed.group_column = na.group_column; ``` ### 使用 `||` 操作符 `||` 操作符也可用于合并两个 JSONB 对象,当键冲突时,右侧对象的值会覆盖左侧对象的值,但可以通过调整顺序来满足不覆盖已有数据的需求。 ```sql -- 同样假设有 existing_data 表 new_data 表 WITH new_aggregated AS ( SELECT group_column, jsonb_object_agg(key_column, value_column) AS new_json FROM new_data GROUP BY group_column ) SELECT ed.id, na.new_json || ed.json_column AS merged_json FROM existing_data ed JOIN new_aggregated na ON ed.group_column = na.group_column; ``` 在上述示例中,`existing_data` 表存储已有 JSONB 数据,`new_data` 表存储新的键值对。首先使用 `jsonb_object_agg` 函数将新数据聚合成 JSONB 对象,然后使用 `jsonb_merge_patch` 函数或 `||` 操作符将新聚合的 JSONB 对象与已有数据合并,以此实现不覆盖已有数据的目的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值