文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

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

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

first field
second field
third field

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

anbob@ANBOB>SELECT REGEXP_SUBSTR ('first field, second field , third field', '[^,]+', 1,rownum)
  2  FROM DUAL
  3  CONNECT BY ROWNUM <=
  4  LENGTH ('first field, second field , third field') - LENGTH (REPLACE ('first field, second field , third field', ',', ''))+1;

REGEXP_SUBSTR('FIRSTFIELD,SECONDFIELD,THIRDFIELD','[^,]+',1,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,1,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, ',', 1, tv.lv) + 1,  
  3                          instr(t.vals, ',', 1, tv.lv + 1) -(  
  4                          instr(t.vals, ',', 1, 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,000,12,31
0011911,00554000,00312,00931 11911,554000,312,931


我的原链接在 http://www.anbob.com/archives/221.html
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯