Loading... 最近在搞 oracle 的相关东西的时候,遇到一点小难题,就是当一个字段的字符串是用分隔符间隔,我需要取其中的某一项时,应该怎么取。 比如我们有字符串 `1021.QQ01`,我们需要把 `QQ01` 给取出来,我们可以清楚的看到中间使用的是点号。来分隔的。经过资料的查询我学会了用正则表达式的方法来实现它。 首先我们来学习一下这个命令: `REGEXP_SUBSTR` 函数: 这个函数的作用是正则分隔字符串,用法为 > function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) > __srcstr :需要进行正则处理的字符串 > __pattern :进行匹配的正则表达式 > __position :起始位置,从第几个字符开始正则表达式匹配(默认为 1) > __occurrence :标识第几个匹配组,默认为 1 > __modifier :模式('i' 不区分大小写进行检索;'c' 区分大小写进行检索。默认为 'c'。) 举几个例子说明下这个函数的用法: ```sql select regexp_substr('1,2,3','[^,]+',1,1) result from dual; ``` 执行结果: ![oracle-split-1.png](http://static.fox-9.com/uploads/2021/08/15/oracle-split-1.png!webp) ```sql select regexp_substr('1,2,3','[^,]+',1,2) result from dual; ``` 执行结果: ![oracle-split-2.png](http://static.fox-9.com/uploads/2021/08/15/oracle-split-2.png!webp) 可见 occurrence 参数用来指定要提取第几个匹配到的数据。以字符串 `'1,2,3'` 为例,这个参数分别要为 1,2,3。 **那么我们来看一下这里的第二个参数,就是正则表达式,这个正则表达式和我们学过的正则表达式几乎没有什么区别,所以很好理解,`[^,]` 表示非逗号,后面的 `+` 表示匹配一个或多个字符,至少一个。所以回到我自己的例子,需要将内容按 `.` 号分割然后获取到第二项,就可以很简单的写成这样:** ```sql select regexp_substr('1021.QQ01','[^.]+',1,2) result from dual; ``` 这样就可以轻松获取了。 ================================== 原文中还提到了动态获取有多少个匹配项的方法: 为了实现动态参数,使用 connect by。 举个例子: ```sql select rownum from dual connect by rownum<=7; ``` 执行结果: ![oracle-split-3.png](http://static.fox-9.com/uploads/2021/08/15/oracle-split-3.png!webp) 可见通过 connect by 可以构造连续的值。 而字符串中逗号的数量是不确定的,如果有 2 个逗号,需要提取的字段就是 3 个。为了确定有多少个需要提取的字段,需要使用 `regexp_replace` 函数。 举个例子: ```sql select regexp_replace('1,2,3',',','') from dual; ``` 执行结果: ![oracle-split-4.png](http://static.fox-9.com/uploads/2021/08/15/oracle-split-4.png!webp) 可见执行正则替换后,字符串中的,被删除了。通过原字符串长度和被替换后字符串长度相减,可以得到原字符串中的逗号数量,加 1 后得到需要提取的匹配字段数量。 最终的语句为: ```sql SELECT REGEXP_SUBSTR ('1,2,3', '[^,]+', 1,rownum) from dual connect by rownum<=LENGTH ('1,2,3') - LENGTH (regexp_replace('1,2,3', ',', ''))+1; ``` 执行结果: ![oracle-split-5.png](http://static.fox-9.com/uploads/2021/08/15/oracle-split-5.png!webp) 大家学会了吗? 感谢大家的收看,我们下期再见! 知识参考自:[https://blog.csdn.net/sofeien/article/details/80534557](https://blog.csdn.net/sofeien/article/details/80534557) 雪山凌狐做了自己的思考和总结。 最后修改:2021 年 08 月 15 日 © 允许规范转载 赞 赠人玫瑰,手留余香