Oracle SQL中如何区分含%的查询是精确匹配还是模糊匹配
解决方案
你可以根据业务场景选择以下两种可落地的方案:
方案1:调整参数解析规则,完全规避冲突
修改你现有的SQL生成逻辑,不再直接以输入是否包含%作为模糊/精确匹配的判断条件,改为以下规则:
- 所有输入默认生成精确匹配的
=语句,哪怕输入内容中间包含%也不会触发模糊查询 - 仅当用户输入的**首尾同时包含
%**时,判定为模糊查询需求,提取首尾%中间的内容生成LIKE语句
示例: - 输入
something with 10%,生成SQL:select * from table where column_name = 'something with 10%',返回精确匹配的1条记录 - 输入
%something%,生成SQL:select * from table where column_name like '%something%',返回所有包含something的记录
如果你的业务需要支持前缀匹配/后缀匹配,也可以调整规则为仅识别输入开头/结尾单独出现的%作为通配符标识,中间出现的%一律视为普通字符。
方案2:使用Oracle原生LIKE转义语法解决冲突
如果你不想修改现有输入规则,可直接用Oracle的ESCAPE子句处理通配符冲突:
- 首先约定转义规则:用户如果要把
%作为普通字符查询,需要在%前加转义符,默认用反斜杠\即可 - 生成LIKE语句时,末尾加上
ESCAPE '\'声明转义符,Oracle会自动把转义符后面的%视为普通字符匹配
示例:
- 用户要精确查询带
%的内容时,输入something with 10\%,生成SQL:
select * from table where column_name like 'something with 10\%' ESCAPE '\'
此时只会返回精确匹配的1条记录,不会匹配到带and above的另一条记录
- 用户要做模糊查询时,直接输入
something%即可,生成的LIKE语句正常执行模糊匹配
内容的提问来源于stack exchange,提问作者Java Programmer
相关产品推荐
相关产品推荐

