oracle中分隔逗号,oracle拆分逗号分隔字符串 实现split

最近老有人问题同样的sql 实现方法,itpub 上发一下,照顾百度用户。

如果一个字符串中有像逗号或其它符号分隔,你想把它折分成列,如’first field,second field,third field’, 拆成

first field second field third field

第一种 用10G开始支持的正则表达式

anbob@ANBOB>SELECT REGEXP_SUBSTR ('first field,third field','[^,]+',1,rownum)

2 FROM DUAL

3 CONNECT BY ROWNUM <=

4 LENGTH ('first field,third field') - LENGTH (REPLACE ('first field,',''))+1;

REGEXP_SUBSTR('FIRSTFIELD,SECONDFIELD,THIRDFIELD',ROWNUM)

------------------------------------------------------------------------------

first field

second field

third field

TIP: REGEXP_SUBSTR 函数是把那个串以正则不是以,(逗号)开头的截取,第二个参数是取第几组,rownum伪列序号,connect 循环 ,循环次数为串总长度-去除分隔符后=几个分隔符 +1

第二种用type,function

第一,先创建一个Type

CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2 (4000)

第二,创建函数

create or replace function split(p_list varchar2,p_sep varchar2 := ’,’)

return type_split pipelined

IS

l_idx pls_integer;

v_list varchar2(50) := p_list;

begin

loop

l_idx := instr(v_list,p_sep);

if l_idx = 0 then

pipe row(substr(v_list,l_idx-1));

v_list := substr(v_list,l_idx+length(p_sep));

else

pipe row(v_list);

exit;

end if;

end loop;

end split;

第三,调试

select * from table(split(‘aaa,bbb,ccc’,’));

拆分列字段

anbob@ANBOB>select * from test11;

ID NAME

-------------------- ----------

1 a,b,c

2 e,d

nbob@ANBOB>with temp0 as (select LEVEL lv from dual CONNECT BY LEVEL <= 100)

2 select id,substr(t.vals,instr(t.vals,tv.lv) + 1,3 instr(t.vals,tv.lv + 1) -(

4 instr(t.vals,tv.lv) + 1)

5 ) AS name

6 from (select id,' || name || ',' AS vals,7 length(name || ',') - nvl(length(REPLACE(name,')),0) AS cnt

8 from test11) t join temp0 tv

9 on tv.lv <= t.cnt order by 1;

ID NAME

-------------------- ------------------------

1 a

1 b

1 c

2 d

2 e

扩展 regexp_replace

V字段中每个值中字符串以,分隔,如果不是以9开头那组串加‘00’

anbob@NCME>create table testreg(v varchar2(80)); Table created. anbob@NCME>insert into testreg values(’911,000,12,31′); 1 row created.

anbob@NCME>insert into testreg values(’11911,554000,312,931′); 1 row created.

anbob@NCME>commit; Commit complete.

anbob@NCME>select ltrim(regexp_replace(‘,’||v,’([,])’,'\100′),’,') newv,v from testreg;

NEWV V —————————— —————————— 00911,00000,0012,0031 911,31 0011911,00554000,00312,00931 11911,931

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值