需求:
将一行数据 '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

因为拆分多个字符串,第一想到的为 正则表达是 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
但是我们要打印出所有的名字,这里就可以使用遍历测试一下;
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
使用 regexp_replace 算出循环的次数
^ - ^ ……