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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:52:35