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

MySQL 8.0.26中JSON_VALUE结合CONCAT报错,求动态键解决方案

问题原因

MySQL的JSON_VALUE函数对第二个参数(JSON路径表达式)有严格限制:它必须是字符串字面量,不能是动态生成的表达式(比如CONCAT结果)或者变量。SQL解析阶段,MySQL会先检查JSON路径的语法合法性,此时动态生成的路径还未被求值,会被判定为不符合语法的路径,直接抛出1064语法错误。

解决方法

方法1:用JSON_EXTRACT替代JSON_VALUE

JSON_EXTRACT支持动态生成的路径字符串,直接替换即可满足需求:

SET @my_json = '{"key1":"val1","key2":"val2"}';
SET @my_key = 'key1';
SELECT JSON_EXTRACT(@my_json, CONCAT('$.', @my_key));

执行结果:"val1"

如果需要和JSON_VALUE一样返回无引号的纯字符串,搭配JSON_UNQUOTE使用:

SELECT JSON_UNQUOTE(JSON_EXTRACT(@my_json, CONCAT('$.', @my_key)));

执行结果:val1

方法2:使用预处理语句

通过预处理语句延迟路径的解析时机,让MySQL在执行阶段才处理动态生成的路径:

SET @my_json = '{"key1":"val1","key2":"val2"}';
SET @my_key = 'key1';
SET @sql_template = 'SELECT JSON_VALUE(?, ?)';
PREPARE dynamic_stmt FROM @sql_template;
SET @dynamic_path = CONCAT('$.', @my_key);
EXECUTE dynamic_stmt USING @my_json, @dynamic_path;
DEALLOCATE PREPARE dynamic_stmt;

执行结果:val1

方法3:用JSON_TABLE将JSON转为行结构查询

如果需要批量处理多个键或更灵活的查询逻辑,可以把JSON数据转成关系表结构后再查询:

SET @my_json = '{"key1":"val1","key2":"val2"}';
SET @my_key = 'key1';
SELECT value
FROM JSON_TABLE(
  @my_json,
  '$.*' COLUMNS(
    key_name VARCHAR(50) PATH '$."$key"',
    value VARCHAR(50) PATH '$'
  )
) AS jt
WHERE key_name = @my_key;

执行结果:val1

内容的提问来源于stack exchange,提问作者MTK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:50:22