在MySQL中将两个JSON数组按键值对合并为一个JSON对象
将两个JSON数组转为对应键值对JSON对象的MySQL实现方法
当然可以实现这个需求!针对你要把两个同位置对应、同长度的JSON数组转成键值对JSON对象的场景,MySQL 8.0及以上版本提供了现成的函数组合来搞定,下面给你一步步说明具体操作:
先准备示例表和数据
假设你的表叫json_demo,包含两个JSON数组字段keys_arr和values_arr,先插入你的示例数据:
CREATE TABLE json_demo ( id INT PRIMARY KEY AUTO_INCREMENT, keys_arr JSON, values_arr JSON ); INSERT INTO json_demo (keys_arr, values_arr) VALUES ('["a", "b", "c"]', '["apple", "banana", "coconut"]');
核心实现SQL
用JSON_TABLE拆分数组为行,再用JSON_OBJECT_AGG聚合为JSON对象:
SELECT JSON_OBJECT_AGG(key_item, value_item) AS result_json FROM json_demo t, -- 把键数组拆成单独的行记录 JSON_TABLE(t.keys_arr, '$[*]' COLUMNS (key_item VARCHAR(100) PATH '$')) keys, -- 把值数组拆成单独的行记录 JSON_TABLE(t.values_arr, '$[*]' COLUMNS (value_item VARCHAR(100) PATH '$')) values WHERE t.id = 1 -- 指定要处理的目标行 -- 关键校验:确保两个数组长度一致,避免错位匹配 AND JSON_ARRAY_LENGTH(t.keys_arr) = JSON_ARRAY_LENGTH(t.values_arr) GROUP BY t.id;
执行这个SQL后,你就能得到想要的结果:{"a": "apple", "b": "banana", "c": "coconut"}
关键函数说明
JSON_TABLE:把JSON数组转换成关系型表的行结构,这样我们就能把数组里的每个元素单独拿出来处理JSON_OBJECT_AGG:把分组后的键和值对聚合为一个JSON对象,正好符合你的需求JSON_ARRAY_LENGTH:用来校验两个数组长度一致,防止因为数组长度不同导致的错误匹配(比如键多值少或者反过来)
低版本MySQL的替代方案(5.7及以下)
如果你的MySQL版本低于8.0,没有JSON_TABLE和JSON_OBJECT_AGG这些函数,实现起来会麻烦很多——需要写自定义存储过程或者用字符串拼接的方式来处理,这种方法不仅容易出错,性能也差。所以更推荐你升级到MySQL 8.0版本来使用上面的便捷方法。
内容的提问来源于stack exchange,提问作者Mahoor13
相关产品推荐
相关产品推荐

