oracle中regexp_like 的使用

oracle中regexp_like 的使用
今天碰到个问题,关于存储多选框的问题,目前存储多选框值是存储到一个字段中,比如:1,2,3。现在有个问题,如果查询1,2 的数据的时候,一般的写法是 like ‘%1%’ or like ‘%2%’ ,如果查询条件很多的话,查询速度变慢,对于此类问题在系统中普遍存在,如何进行优化?
速度慢的关键地方是使用了or ,大部分解决办法是使用union all ,弊端很多,查询条件多,要union all很多次,直接pass掉。
其实使用regexp_like 完全可以解决此类问题,下面是搜的用法,大家自行查看。
https://www.cnblogs.com/wangrui1587165/p/9958321.html
下面是正则表达式中介绍
1、x|y
匹配x或y,其中x和y是一个或多个字符
war|peace 可以匹配 war 或 peace
2、[abc]
匹配中括号内的任意一个字符
[abc] 可以匹配 abc 和 bbc
至于使用上面1还是2,根据自己的实际情况。本次SQL优化,使用了1。 like ‘%1%’ or like ‘%2%’ 优化为regexp_like(字段,‘1|2’) 因数据库可能存在01,02 的情况,如果使用2的话,regexp_like(字段,’[01]’) 会把02也查询出来,采用1就不会。

同时接受下,多字段like模糊查询优化:
最常见的写法:where a like ‘%xx%’ or b like ‘%xx%’ or c like ‘%xx%’; 这种写法查询效率低,经过调查,下面的方法可以替代,并且效率高:
1、如果like的关键字相同:
where instr(nvl(a, ‘’)||nvl(b,’’)||nvl(c,’’), ‘xx’) > 0
把要模糊查询的字段先拼接起来,拼接时需要把null转成‘’,否则只要有一个字段值是空,整个拼接的字符串都成空了, 然后用instr 函数去过滤;
2、如果like的关键字不同:
where instr(a, ‘xx’) > 0 or instr(b, ‘yy’) > 0 or instr(c, ‘zz’) > 0
经过测试,这两种方法都比like效率要高;
当然mysql同样有相关的函数,REGEXP 大家自行搜索。
原文链接:https://blog.csdn.net/zhujianpengzha/java/article/details/52711554

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值