oracle 存储过程 一条一对多数据拆分成一对一数据插入另一个表

ahahaha22 2017-11-02 09:15:24
姓名 序号 变为 姓名 序号
张三 1,2,3 张三 1
张三 2
张三 3
...全文
492 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2017-11-02
  • 打赏
  • 举报
回复
引用 8 楼 weixin_38847048 的回复:
这个是把前面整个一大串 替换成了 to_char(level) 能达到目的么

列转行分方法非常多,还有union和unpivot(oracle 11g新特性)
花开了叫我 2017-11-02
  • 打赏
  • 举报
回复
这个是把前面整个一大串 替换成了 to_char(level) 能达到目的么
花开了叫我 2017-11-02
  • 打赏
  • 举报
回复
SQL> SQL> WITH t AS 2 (SELECT '张三' NAME, '2,3,4' id FROM dual) 3 SELECT NAME, regexp_replace(id, '(\w+)\,(\w+)\,(\w+)', LEVEL) id 4 FROM t 5 CONNECT BY LEVEL <= regexp_count(id, ',') + 1; NAME ID -------------------------------- -------------------------------------------------------------------------------- 张三 1 张三 2 张三 3
碧水幽幽泉 2017-11-02
  • 打赏
  • 举报
回复
引用 4 楼 weixin_38847048 的回复:
[quote=引用 3 楼 qq646748739 的回复:]
   
--写法2:
select name,trim(regexp_substr(id,'[^,]+',1,level)) as id
from tmp
connect by name = prior name
and prior dbms_random.value is not null
and level <= length(regexp_replace(id, '[^,]'))+1;

--写法3
select name,
regexp_replace(id,'(\w+)\,(\w+)\,(\w+)',level) id
from tmp
connect by level <= regexp_count(id,',')+1;


regexp_replace(id,'(\w+)\,(\w+)\,(\w+)','\'||to_char(level)) 你的这个后向引用完全误导新人[/quote]
自己测试下再评论,OK? 我的问题出在哪?
碧水幽幽泉 2017-11-02
  • 打赏
  • 举报
回复

--写法4:
select name,
substr(','||id||',',instr(','||id||',', ',', 1, level) + 1, instr(','||id||',', ',', 1, level + 1) -( instr(','||id||',', ',', 1, level) + 1) )
from tmp
connect by level <= regexp_count(id,',')+1
order by level
花开了叫我 2017-11-02
  • 打赏
  • 举报
回复
引用 3 楼 qq646748739 的回复:
   
--写法2:
select name,trim(regexp_substr(id,'[^,]+',1,level))  as id
 from tmp
connect by name = prior name 
 and prior dbms_random.value is not null
 and level <= length(regexp_replace(id, '[^,]'))+1;

--写法3
 select name,
            regexp_replace(id,'(\w+)\,(\w+)\,(\w+)',level) id
  from tmp
  connect by level <= regexp_count(id,',')+1;
 
regexp_replace(id,'(\w+)\,(\w+)\,(\w+)','\'||to_char(level)) 你的这个后向引用完全误导新人
碧水幽幽泉 2017-11-02
  • 打赏
  • 举报
回复
   
--写法2:
select name,trim(regexp_substr(id,'[^,]+',1,level)) as id
from tmp
connect by name = prior name
and prior dbms_random.value is not null
and level <= length(regexp_replace(id, '[^,]'))+1;

--写法3
select name,
regexp_replace(id,'(\w+)\,(\w+)\,(\w+)',level) id
from tmp
connect by level <= regexp_count(id,',')+1;
碧水幽幽泉 2017-11-02
  • 打赏
  • 举报
回复

--创建临时表
create table tmp as(select '张三' name, '1,2,3' id from dual);

碧水幽幽泉 2017-11-02
  • 打赏
  • 举报
回复
方法很多,先试试这个,我再用其他方法写个

select distinct name,regexp_substr(id,'[^,]+',level) as id
from tmp
connect by level <= regexp_count(id,',')+2
order by id
花开了叫我 2017-11-02
  • 打赏
  • 举报
回复
引用 9 楼 qq646748739 的回复:
[quote=引用 8 楼 weixin_38847048 的回复:] 这个是把前面整个一大串 替换成了 to_char(level) 能达到目的么
列转行分方法非常多,还有union和unpivot(oracle 11g新特性)[/quote] 我不知道多么? model split ... 太多了 对自己严格要求的程序员会为自己的错误感到羞愧 而你在转移话题

17,089

社区成员

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

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