SQL查询JSON字段报错:添加JSON_VALUE条件后提示格式错误
错误原因及解决方案
错误原因
SQL Server的查询优化器不会严格按照WHERE子句中条件的书写顺序执行判断。即便你写了ISJSON(code_data)=1来筛选合法JSON记录,优化器仍可能优先执行JSON_VALUE(code_data,'$.subscriptionID') = 'I-AMJM4M6AX3RP'这个条件。此时,那些code_data字段不是合法JSON格式的记录(比如开头为字符'1'的内容)会被JSON_VALUE函数处理,直接触发"JSON文本格式不正确"的报错。
解决方案
方案1:用子查询/CTE预先过滤合法JSON
先通过公用表表达式(CTE)筛选出所有合法的JSON记录,再针对这些记录做JSON_VALUE的条件判断:
WITH ValidJsonCTE AS ( SELECT code_data FROM code_table WHERE code_group = 'pptoken' AND code_data LIKE '{%' AND ISJSON(code_data) = 1 ) SELECT code_data FROM ValidJsonCTE WHERE JSON_VALUE(code_data, '$.subscriptionID') = 'I-AMJM4M6AX3RP'
方案2:用CASE表达式强制执行顺序
通过CASE表达式确保只有合法JSON才会进入JSON_VALUE函数处理:
SELECT code_data FROM code_table WHERE code_group = 'pptoken' AND code_data LIKE '{%' AND ISJSON(code_data) = 1 AND CASE WHEN ISJSON(code_data) = 1 THEN JSON_VALUE(code_data, '$.subscriptionID') ELSE '' END = 'I-AMJM4M6AX3RP'
内容的提问来源于stack exchange,提问作者Velocedge
相关产品推荐
相关产品推荐

