最近遇到一个问题,须要把一个带有,的字符串拆分红多列。经过查询资料,这个操做须要使用如下2个关键知识:正则表达式
1. REGEXP_SUBSTR函数函数
这个函数的做用是正则分隔字符串,用法为regexp
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)blog
__srcstr :须要进行正则处理的字符串字符串
__pattern :进行匹配的正则表达式it
__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)io
__occurrence :标识第几个匹配组,默认为1function
__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)select
举几个例子说明下这个函数的用法:im
select regexp_substr('1,2,3','[^,]+',1,1) result from dual;
执行结果:
select regexp_substr('1,2,3','[^,]+',1,2) result from dual;
执行结果:
可见occurrence参数用来指定要提取第几个匹配到的数据。以字符串'1,2,3'为例,这个参数分别要为1,2,3。
2.为了实现动态参数,使用 connect by
举个例子:
select rownum from dual connect by rownum<=7;
执行结果:
可见经过connect by能够构造连续的值
3.字符串中逗号的数量是不肯定的,若是有2个逗号,须要提取的字段就是3个。为了肯定有多少个须要提取的字段,使用regexp_replace函数
举个列子:
select regexp_replace('1,2,3',',','') from dual;
执行结果:
可见执行正则替换后,字符串中的,被删除了。经过原字符串长度和被替换后字符串长度相减,能够获得原字符串中的逗号数量,加1后获得须要提取的匹配字段数量
最终的语句为:
SELECT REGEXP_SUBSTR ('1,2,3', '[^,]+', 1,rownum)
from dual connect by rownum<=LENGTH ('1,2,3') - LENGTH (regexp_replace('1,2,3', ',', ''))+1;
执行结果: