MySQL 5.7如何通过子查询多行结果调用JSON_REMOVE删除JSON字段键
问题原因
JSON_REMOVE函数要求传入的是多个独立的路径参数(格式为'$.键名'),无法直接识别JSON数组类型的参数,所以你之前用JSON_ARRAYAGG的写法不生效。
解决方案
方案1:使用动态SQL执行批量删除(推荐,无需额外存储对象)
你可以先把table2里所有要删除的键拼接成JSON_REMOVE需要的路径参数列表,再通过动态SQL执行更新:
-- 拼接生成UPDATE语句 SET @sql = NULL; SELECT GROUP_CONCAT(CONCAT('''$.', `key`, '''')) INTO @sql FROM table2; SET @sql = CONCAT('UPDATE table1 SET data = JSON_REMOVE(data, ', @sql, ')'); -- 执行动态SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
方案2:使用存储过程逐键删除(适用于不允许动态SQL的场景)
如果你的环境禁止使用动态SQL,可以写存储过程遍历table2的所有键,逐个执行删除操作:
DELIMITER // CREATE PROCEDURE batch_remove_json_keys() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE current_key VARCHAR(255); -- 定义游标遍历所有要删除的键 DECLARE key_cursor CURSOR FOR SELECT `key` FROM table2; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN key_cursor; key_loop: LOOP FETCH key_cursor INTO current_key; IF done THEN LEAVE key_loop; END IF; -- 逐键删除,键不存在时JSON_REMOVE不会报错,不影响正常数据 UPDATE table1 SET data = JSON_REMOVE(data, CONCAT('$.', current_key)); END LOOP; CLOSE key_cursor; END // DELIMITER ; -- 调用存储过程完成更新 CALL batch_remove_json_keys();
注意事项
- 两种方案均兼容MySQL 5.7版本
- 如果table2的
key字段包含空格、引号等特殊字符,需要额外做转义处理,避免动态SQL出现语法错误 - 执行更新前建议先备份table1数据,或者先将UPDATE替换为SELECT测试JSON_REMOVE的执行效果是否符合预期
内容的提问来源于stack exchange,提问作者user16461680
相关产品推荐
相关产品推荐

