如何在oracle中使用类似split函数分割字符串

cjbright 2015-07-30 02:57:19
比如表结构是:
ID 姓名 电话
1 张三 123456;234567;789451
2 李四 444444;555555;666666;777777
3 王五 222222;333333
要分割为:
ID 姓名 电话1 电话2 电话3 电话4 电话5。。。。。。
1 张三 123456 234567 789451
2 李四 444444 555555 666666 777777
3 王五 222222 333333
某人的电话有多少个可能未知,那么需要分割出来的列数未知。
这样的结构应该怎么去实现?
...全文
6651 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengccy 2015-07-31
  • 打赏
  • 举报
回复

select *
  from (select t.id,
               t.姓名,
               column_value as s_id,
               regexp_substr(电话, '[^;]+', 1, column_value) as 电话
          from tmp t,
               table(cast(multiset
                          (select level
                             from dual
                           connect by level <= regexp_count(电话, ';') + 1) as
                          sys.odcinumberlist)) t1)
pivot(max(电话)
   for s_id in(1 as 电话1, 2 as 电话2, 3 as 电话3, 4 as 电话4))
 order by id
这个拼接语句模板
chengccy 2015-07-31
  • 打赏
  • 举报
回复
drop table test;
create table test as 
select 1 as ID,'张三' as 姓名,'123456;234567;789451' as 电话 from dual 
union all 
select 2,'李四','444444;555555;666666;777777' from dual 
union all 
select 3,'王五','222222;333333' from dual
测试建表
chengccy 2015-07-31
  • 打赏
  • 举报
回复
用PLSQL : 例子:11g环境
create or replace procedure my_pro(p_data out sys_refcursor) is
  phone_count number;
  i           number;
  v_sql_phone varchar2(32000);
  v_sql       varchar2(32000);
begin
  -- 获取最大的电话个数;
  select max(regexp_count(t.电话, ';')) + 1 into phone_count from test t;
  for i in 1 .. phone_count loop
    v_sql_phone := v_sql_phone || ',' || i || ' as 电话' || i;
  end loop;
  v_sql_phone := ltrim(v_sql_phone, ',');
  v_sql       := 'select *
  from (select t.id,
               t.姓名,
               column_value as s_id,
               regexp_substr(电话, ''[^;]+'', 1, column_value) as 电话
          from tmp t,
               table(cast(multiset
                          (select level
                             from dual
                           connect by level <= regexp_count(电话, '';'') + 1) as
                          sys.odcinumberlist)) t1)
pivot(max(电话)
   for s_id in(' || v_sql_phone || '))
 order by id';
  open p_data for v_sql;
end;
binsweet 2015-07-31
  • 打赏
  • 举报
回复
你这是要转成列,且不固定,长短不一,就是实现了,效率也低,还不如从结构上考虑一下

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧