首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:如何将合并的行分成单独的行

SQL:如何将合并的行分成单独的行
EN

Stack Overflow用户
提问于 2012-05-10 22:26:19
回答 1查看 135关注 0票数 2

我有一个数据库表,如下所示:

代码语言:javascript
复制
id   |   check_number        |   amount
1    |   1001]1002]1003      |   200]300]100
2    |   2001]2002           |   500]1000
3    |   3002]3004]3005]3007 |   100]300]600]200

我想把这些记录分成如下几部分:

代码语言:javascript
复制
id   |   check_number    |   amount
1    |   1001            |   200
2    |   1002            |   300
3    |   1003            |   100
.    |     .             |    .
.    |     .             |    .
.    |     .             |    .

如何仅在Oracle和SQL Server中使用SQL来完成此操作?

谢谢,

麦洛

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-10 23:59:26

仅在Oracle中,使用按级别连接方法(请参见here),但有以下几点注意事项:

代码语言:javascript
复制
select rownum, id,
       substr(']'||check_number||']'
              ,instr(']'||check_number||']',']',1,level)+1
              ,instr(']'||check_number||']',']',1,level+1) 
               - instr(']'||check_number||']',']',1,level) - 1) C1VALUE,
       substr(']'||amount||']'
              ,instr(']'||amount||']',']',1,level)+1
              ,instr(']'||amount||']',']',1,level+1) 
               - instr(']'||amount||']',']',1,level) - 1) C2VALUE
    from table
connect by id = prior id and prior dbms_random.value is not null  
      and level <= length(check_number) - length(replace(check_number,']')) + 1


ROWNUM ID  C1VALUE C2VALUE

1      1   1001    200
2      1   1002    300
3      1   1003    100
4      2   2001    500
5      2   2002    1000
6      3   3002    100
7      3   3004    300
8      3   3005    600
9      3   3007    200

本质上,我们使用oracle的层次结构函数展开查询,然后只获得check_number和amount列中每个数据“列”中的数据的子字符串。

主要警告:要转换的数据在两列中必须具有相同数量的“数据元素”,因为我们使用第一列来“计算”要转换的项目的数量。

我已经在11gR2上对此进行了测试。YMMV也取决于DMBS版本。请注意,需要使用“the”运算符,它可以防止oracle进入无限的connect by循环。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10536146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档