Oracle的字符串转in查询用的数组时用regexp_substr(str,reg,start,order_number,mode)

Oracle的字符串有时候需要转为in所用的数组(我们眼中,它们和数组写法没啥区别),这时候就可以用SQL语句直接干起来。

1、Oracle一个非常有用的函数regexp_substr(str,reg,start,order_number,mode)函数

  1. str:要被处理的那个字符串;
  2. reg:将字符串转为数组时,一个必要的正则表达式;
  3. start:从字符串的哪个位置开始去进行转换;
  4. order_number:当字符串被按照上面的规则分开后,这个函数返回哪个序号(数组都是有序号的,不同的是:这里序号从1开始,且这玩意儿本质上不是数组)对应的值;
  5. mode:这个可以不写,默认为'c'——区分大小写,它是针对正则表达式来说的,当被赋值'i'时,正则表达式不区分大小写进行匹配;
  6. 写个查询用的例子:select regexp_substr('123,234,345,456,567', '[^,]+', 1, 2) from dual ——结果为:234

2、有了上面的基础解析之后,我们也只能获取到某一个值,而不是整个“数组”,那么就需要注意第4个参数,将第4个参数写为“level”

  1. 个人理解中,level就是一个变量了;
  2. 当上面的函数用了level之后,就必须在后面写上connect by,以connect by代替where来对level进行条件过滤;
  3. 上例子:select regexp_substr('123,234,345,456,567', '[^,]+', 1, level) from dual connect by level <= length('123,234,345,456,567') - length(replace('123,234,345,456,567', ',')) + 1 ——结果就不写了,自己复制过去执行下就知道了;
  4. 有了上面的例子,那么就已经将字符串转为了能用于in查询的数据了;

3、最后,再解析一下connect by后面的两个length

  1. 第一个length单纯的为了获取原字符串的长度;
  2. 第二个length就不单纯了,例如上面的SQL,表面上是为了去除分割用的字符,实际上它是为了计数,计算这个字符串中间有几个分割用的字符(串);注意看,是字符(串),也就是说,用于分割字符串的标记可能是单个字符,也可能是多个字符串;而这第二个length却仅仅是为了方便后面获取有几个分割字符(串)的;——所以第二个length在获取时,那个replace一定要保证被替换掉的务必是用于分割的字符(串)中的一个,一个,一个,不是多个!
  3. 两个length相减,自然获取到了用于用于分割的字符(串)的个数,再加上1,就知道了字符串被分割为“数组”后,“数组”元素的个数,那么这时,你也看懂了level的这个筛选条件了

总之:只要花几分钟时间详细看完,你一定可以拿着这个函数在其他人面前装牛气了。

最后,上面的内容是本人在网上查看资料,待将知识消化吸收之后,自行理解并手打出来的,如果觉得本人有所侵权,敬请留言或联系网站管理员处理(如果联系不上本人的话)。


版权声明:本文为chen6021550215he原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。