MySQL中能否为JSON_SET的路径参数设置变量?
MySQL中JSON_SET函数路径参数使用变量的解决方案
MySQL的JSON_SET函数默认不支持直接将用户变量作为路径参数传入——你提供的第二个示例无法运行,是因为用户变量@p会被当作普通字符串传递,而非被解析为JSON路径表达式。
解决方法:使用预处理语句
要实现用变量作为JSON_SET的路径参数,可以借助MySQL的预处理语句(PREPARE + EXECUTE),它会在执行阶段正确解析变量为JSON路径。
基础示例
-- 定义路径变量 SET @p = '$[0].k'; -- 定义目标JSON字符串 SET @target_json = '[{"k":"1"}]'; -- 定义要设置的新值 SET @new_val = 23; -- 构建预处理SQL语句 SET @sql_stmt = CONCAT('SELECT JSON_SET(?, ?, ?) AS updated_json'); -- 预处理并执行语句 PREPARE stmt FROM @sql_stmt; EXECUTE stmt USING @target_json, @p, @new_val; -- 释放预处理资源 DEALLOCATE PREPARE stmt;
执行后会返回预期结果:[{"k": 23}]。
结合JSON_SEARCH的实际场景
如果你的路径来自JSON_SEARCH的查询结果,同样可以用这个方法:
SET @target_json = '[{"k":"1"},{"k":"2"},{"k":"3"}]'; -- 通过JSON_SEARCH获取目标路径 SET @p = JSON_SEARCH(@target_json, 'one', '2'); SET @new_val = 99; -- 复用预处理逻辑 SET @sql_stmt = CONCAT('SELECT JSON_SET(?, ?, ?) AS updated_json'); PREPARE stmt FROM @sql_stmt; EXECUTE stmt USING @target_json, @p, @new_val; DEALLOCATE PREPARE stmt;
执行后会将值为2的k字段更新为99,返回结果:[{"k": "1"}, {"k": 99}, {"k": "3"}]。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

