SQL Server 2017中LIKE查询未返回预期结果的问题求助
问题原因分析
你的查询返回非预期结果,核心原因是SQL Server的LIKE运算符中,_是单个任意字符的通配符——查询条件里的contract_permitid中的_会匹配数据里contract.permitid的.,因此被判定为匹配项,导致返回结果不符合预期。
解决方案
下面提供几种可行的解决方式:
方式1:用ESCAPE子句转义通配符
指定一个转义字符(例如\),将查询中的_标记为普通字符:
SELECT * FROM Table_1 WHERE (permitJSON LIKE '%contract\_permitid%' ESCAPE '\' OR permitJSON LIKE '%contract\_eid%' ESCAPE '\')
方式2:用方括号包裹_
在LIKE语法中,方括号内的字符会被视为普通字符,直接将_写成[_]即可:
SELECT * FROM Table_1 WHERE (permitJSON LIKE '%contract[_]permitid%' OR permitJSON LIKE '%contract[_]eid%')
方式3:改用原生JSON查询(推荐)
既然存储的是JSON数据,SQL Server 2017支持原生JSON处理,将列改为NVARCHAR(MAX)(或直接使用JSON类型)后,用JSON函数查询更精准高效,也能避免通配符冲突:
步骤1:修改列类型(可选,若原列是VARCHAR建议转换)
ALTER TABLE Table_1 ALTER COLUMN permitJSON NVARCHAR(MAX)
步骤2:用JSON函数查询
SELECT * FROM Table_1 WHERE JSON_VALUE(permitJSON, '$.actions[0].body') LIKE '%contract[_]permitid%' OR JSON_VALUE(permitJSON, '$.actions[0].body') LIKE '%contract[_]eid%'
如果actions是多元素数组,用OPENJSON遍历所有元素:
SELECT t.* FROM Table_1 t CROSS APPLY OPENJSON(t.permitJSON, '$.actions') AS j WHERE j.value LIKE '%contract[_]permitid%' OR j.value LIKE '%contract[_]eid%'
内容的提问来源于stack exchange,提问作者Kung Fu Ninja
相关产品推荐
相关产品推荐

