MySQL如何将多行JSON对象合并转换为JSON数组?
多行JSON对象转标准JSON数组实现方案
方案一:原生JSON聚合函数实现(优先推荐)
如果你的数据库是MySQL 5.7.22及以上版本,直接使用内置的JSON_ARRAYAGG()聚合函数即可,该函数会自动将多行JSON对象合并为合法的JSON数组,自动处理分隔符、格式转义,不需要手动拼接字符串,出错概率极低。
修正后的可直接运行SQL如下:
SELECT JSON_ARRAYAGG( JSON_OBJECT('uniqueId', uniqueId, 'name', name) ) AS actors FROM ( SELECT af.id as uniqueId, al.skill_type_name as name FROM actor_family af INNER JOIN actor_layered al ON af.id = al.actor_family_id ) AS actor_source;
提示:如果你需要按某个维度分组生成多个数组,只需要在最后加上对应
GROUP BY字段即可;如果需要全量数据合并为单个数组,不需要加GROUP BY。额外修正:你原有SQL存在两处语法问题:一是子查询表别名定义为
af/al,SELECT字段时却用了未定义的stf/stl别名;二是子查询输出字段别名为familyId,外层却引用uniqueId字段,上述SQL已经同步修正这两处问题,你可以根据实际表结构调整字段映射。
方案二:低版本兼容:GROUP_CONCAT手动拼接
如果你的数据库版本较低不支持JSON_ARRAYAGG,可以用GROUP_CONCAT实现,要注意三个容易出错的点:
- 拼接结果必须手动包裹
[和]才能构成合法数组 - 提前调整
group_concat_max_len参数,避免数据量大时结果被截断 - 直接拼接JSON_OBJECT输出结果,不要额外加转义或多余引号
对应SQL如下:
-- 先调大GROUP_CONCAT允许的最大长度,避免结果截断,根据实际数据量调整数值即可 SET SESSION group_concat_max_len = 1024000; SELECT CONCAT( '[', GROUP_CONCAT( JSON_OBJECT('uniqueId', uniqueId, 'name', name) SEPARATOR ',' ), ']' ) AS actors FROM ( SELECT af.id as uniqueId, al.skill_type_name as name FROM actor_family af INNER JOIN actor_layered al ON af.id = al.actor_family_id ) AS actor_source;
之前使用GROUP_CONCAT失败的常见原因
- 没有手动包裹数组的中括号,仅得到逗号分隔的JSON对象串,不符合数组格式
- 拼接时额外添加了引号、转义符,导致JSON格式非法
- 未调整GROUP_CONCAT长度阈值,长内容被截断,生成损坏的JSON
- 子查询字段别名和外层引用不匹配,生成的JSON内容不符合预期
内容的提问来源于stack exchange,提问作者Aԃιƚყα Gυɾαʋ
相关产品推荐
相关产品推荐

