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
相关产品推荐
相关产品推荐

