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

ahahaha22 2017-11-02 09:15:24
姓名 序号 变为 姓名 序号
张三 1,2,3 张三 1
张三 2
张三 3
...全文
371 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
碧水幽幽泉 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 ... 太多了 对自己严格要求的程序员会为自己的错误感到羞愧 而你在转移话题
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
加入

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2017-11-02 09:15
社区公告
暂无公告