You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:54:01