需求:

将一行数据 '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 算出循环的次数

^  - ^ ……

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐