天天看点

Oracle 按照指定分割符拆分一行数据为多行

需求:

将一行数据 'ADAMS,FORD,JONES,SCOTT,SMITH'; 拆分为一行一个名字的形式

测试代码:

create or replace view v as
select listagg(d.ename,',') within group (order by d.ename) as total_ename
  from emp d 
 where d.deptno in('10','20')
 group by d.deptno
           
Oracle 按照指定分割符拆分一行数据为多行

 因为拆分多个字符串,第一想到的为 正则表达是 regexp_substr ; 具体拆分的个数为 分割符+1 个。

代码衍生如下:

regexp_substr(s.total_ename, '[^,]', 1)
--这里我们截取限定为 [^,] ,可以分层理解, ^ 是否定,非的含义; 这里中括号内的字符可以理解为要截取的字符;但是加了 ^ ,就表示截取非 逗号的字符;从第一位开始,默认截取一位字符,而不是截取到最后
分割符整理好后,就要整理截取多位字符
regexp_substr(s.total_ename, '[^,]+', 1)
SQL
select s.total_ename 
       ,regexp_substr(s.total_ename, '[^,]+', 1) as test
  from V s 
           
Oracle 按照指定分割符拆分一行数据为多行

但是我们要打印出所有的名字,这里就可以使用遍历测试一下;

select distinct s.total_ename, level, --去重
       regexp_substr(s.total_ename, '[^,]+',1,level) as str_name
  from v s 
connect by level <= length(regexp_replace(s.total_ename,'[^,]+',''))+1
order by s.total_ename,2
           
Oracle 按照指定分割符拆分一行数据为多行

使用 regexp_replace 算出循环的次数

^  - ^ ……