Oracle SQL不使用LIKE实现指定模糊匹配的替代语句查询
Oracle SQL 不使用LIKE实现等效模糊匹配的方案
原SQL片段的匹配逻辑为满足以下两个条件任意其一:
- 字符串中先出现大写字母
B,之后任意位置出现小写字母l - 字符串中先出现大写字母
L,之后任意位置出现小写字母b
以下是两种功能完全一致、不使用LIKE关键字的实现方案:
方案1:使用INSTR函数实现(性能更优)
INSTR是Oracle内置字符串查找函数,返回子串在目标字符串中的位置,未匹配返回0,嵌套调用即可实现顺序匹配逻辑:
WHERE (INSTR(c.name, 'B') > 0 AND INSTR(c.name, 'l', INSTR(c.name, 'B')) > 0) OR (INSTR(c.name, 'L') > 0 AND INSTR(c.name, 'b', INSTR(c.name, 'L')) > 0)
该方案和原LIKE的大小写敏感行为完全一致,无正则解析开销,适合大数据量查询场景。
方案2:使用REGEXP_LIKE正则函数实现(写法更简洁)
Oracle原生支持正则匹配函数REGEXP_LIKE,可以用更短的代码实现相同逻辑:
WHERE REGEXP_LIKE(c.name, 'B.*l|L.*b')
正则中B.*l表示B后跟随任意字符再跟随l,|表示或逻辑,默认大小写敏感,和原LIKE行为完全匹配。
内容的提问来源于stack exchange,提问作者oharujyu
相关产品推荐
相关产品推荐

