如何在SQL中合并两个JSON对象?
合并SQL表中的两个JSON对象
直接用字符串拼接的方式容易引发格式错误、键冲突处理不当等问题,更可靠的方案是利用数据库原生的JSON函数实现。以下是主流数据库的具体实现方式:
PostgreSQL
PostgreSQL 针对jsonb类型提供了jsonb_concat函数,可直接合并多个JSON对象:
SELECT jsonb_concat( '{"abc":"value1", "xyz":"value2"}'::jsonb, '{"pqr":"value3"}'::jsonb ) AS merged_json;
如果是json类型,先转成jsonb再合并即可。若存在重复键,后面的对象会覆盖前面的键值。
MySQL
MySQL 8.0+ 支持两种合并函数,可按需选择:
JSON_MERGE_PRESERVE:保留所有键,重复键会生成数组(值不同时)
SELECT JSON_MERGE_PRESERVE( '{"abc":"value1", "xyz":"value2"}', '{"pqr":"value3"}' ) AS merged_json;
JSON_MERGE_PATCH:后面的对象覆盖前面的重复键
SELECT JSON_MERGE_PATCH( '{"abc":"value1", "xyz":"value2"}', '{"pqr":"value3"}' ) AS merged_json;
你的场景中两者都能得到目标结果,推荐用JSON_MERGE_PATCH处理潜在的键冲突。
SQL Server
SQL Server 2022+ 简洁写法
借助JSON_OBJECT_AGG和OPENJSON实现合并:
SELECT JSON_OBJECT_AGG([key], [value]) AS merged_json FROM ( SELECT [key], [value] FROM OPENJSON('{"abc":"value1", "xyz":"value2"}') UNION ALL SELECT [key], [value] FROM OPENJSON('{"pqr":"value3"}') ) AS combined;
兼容旧版本的写法
用JSON_MODIFY逐个合并键值:
DECLARE @json1 NVARCHAR(MAX) = '{"abc":"value1", "xyz":"value2"}'; DECLARE @json2 NVARCHAR(MAX) = '{"pqr":"value3"}'; SELECT JSON_MODIFY( @json1, CONCAT('$."', [key], '"'), [value] ) INTO #temp FROM OPENJSON(@json2); SELECT TOP 1 * FROM #temp; DROP TABLE #temp;
不推荐字符串拼接的原因
直接用字符串函数拼接(比如去掉第二个JSON的{,替换第一个JSON的}为,xxx})存在诸多问题:
- 若JSON包含嵌套结构、转义字符,会直接破坏格式
- 无法合理处理键重复的情况,易生成无效JSON
- 代码可读性差,后续维护成本高
内容的提问来源于stack exchange,提问作者shadaab farhan
相关产品推荐
相关产品推荐

