测试数据:

  1. CREATE TABLE t (str VARCHAR2(30));
  2. INSERT INTO t VALUES ( 'X,Y,Z' );
  3. INSERT INTO t VALUES ( 'XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG' );
  4. commit;

--1、multiset 8i之后都支持

  1. SQL> CREATE OR REPLACE TYPE number_ntt AS TABLE OF NUMBER;
  2. 2  /
  3. Type created
  4. SQL> col value for a20
  5. SQL>
  6. SQL> with ilv as
  7. 2   (select str || ',' as str,
  8. 3           (length(str) - length(replace(str, ','))) + 1 as no_of_elements
  9. 4      from t)
  10. 5  select a.str, regexp_substr(a.str, '[^,]+', 1, b.column_value) value
  11. 6    from ilv a, table(cast(multiset (select rownum rn
  12. 7                       from dual
  13. 8                     connect by rownum <= a.no_of_elements) as number_ntt)) b;
  14. STR                             VALUE
  15. ------------------------------- --------------------
  16. X,Y,Z,                          X
  17. X,Y,Z,                          Y
  18. X,Y,Z,                          Z
  19. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, XXX
  20. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, Y
  21. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, ZZ
  22. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, AAAAA
  23. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, B
  24. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, CCC
  25. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, D
  26. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, E
  27. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, F
  28. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, GGG
  29. 13 rows selected
  30. SQL>

2、自关联connect by 10g之后

  1. SQL> select str,
  2. 2         regexp_substr(str, '[^,]+', 1, level) value
  3. 3    from t
  4. 4  connect by
  5. 5   str = prior str
  6. 6   and instr(str||',', ',', 1, level) > 0
  7. 7   and prior dbms_random.value is not null;
  8. STR                            VALUE
  9. ------------------------------ --------------------
  10. X,Y,Z                          X
  11. X,Y,Z                          Y
  12. X,Y,Z                          Z
  13. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX
  14. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y
  15. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ
  16. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA
  17. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B
  18. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC
  19. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D
  20. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E
  21. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F
  22. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG
  23. 13 rows selected
  24. SQL>

3、自关联,非CONNECT BY方式

  1. SQL> with tmp as (
  2. 2  select t.*,
  3. 3         length(str)-length(regexp_replace(str, ',', ''))+1 len
  4. 4    from t
  5. 5  )
  6. 6  select a.*, regexp_substr(str, '[^,]+', 1, rn) value
  7. 7    from tmp a, (select rownum rn from dual connect by level <= (select max(len) from tmp x)) b
  8. 8   where a.len>=b.rn
  9. 9   order by 1;
  10. STR                                   LEN VALUE
  11. ------------------------------ ---------- --------------------
  12. X,Y,Z                                   3 Y
  13. X,Y,Z                                   3 Z
  14. X,Y,Z                                   3 X
  15. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 GGG
  16. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 B
  17. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 CCC
  18. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 D
  19. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 E
  20. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 F
  21. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 ZZ
  22. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 Y
  23. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 XXX
  24. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG         10 AAAAA
  25. 13 rows selected
  26. SQL>

4、Model子句,复杂度有点小高

  1. SQL> col single_element for a15
  2. SQL>
  3. SQL> with ilv as
  4. 2   (select str as orig_str,
  5. 3           ',' || str || ',' as mod_str,
  6. 4           1 as start_pos,
  7. 5           length(str) as end_pos,
  8. 6           (length(str) - length(replace(str, ','))) + 1 as element_count,
  9. 7           0 as element_no,
  10. 8           rownum as rn
  11. 9      from t)
  12. 10  select orig_str as original_string,
  13. 11         substr(mod_str, start_pos, end_pos - start_pos) as single_element,
  14. 12         element_no,
  15. 13         element_count
  16. 14    from (select *
  17. 15            from ilv
  18. 16           model partition by(rn, orig_str, mod_str)
  19. 17                 dimension by(element_no)
  20. 18                 measures(start_pos, end_pos, element_count)
  21. 19                 rules iterate(2000)
  22. 20                    until(iteration_number + 1 = element_count[0])(
  23. 21                        start_pos[iteration_number + 1] = instr(cv(mod_str), ',', 1, cv(element_no)) + 1,
  24. 22                        end_pos[iteration_number + 1] = instr(cv(mod_str), ',', 1, cv(element_no) + 1)
  25. 23                    )
  26. 24          )
  27. 25   where element_no != 0
  28. 26   order by mod_str, element_no;
  29. ORIGINAL_STRING                SINGLE_ELEMENT  ELEMENT_NO ELEMENT_COUNT
  30. ------------------------------ --------------- ---------- -------------
  31. X,Y,Z                          X                        1
  32. X,Y,Z                          Y                        2
  33. X,Y,Z                          Z                        3
  34. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX                      1
  35. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y                        2
  36. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ                       3
  37. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA                    4
  38. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B                        5
  39. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC                      6
  40. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D                        7
  41. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E                        8
  42. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F                        9
  43. XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG                     10
  44. 13 rows selected
  45. SQL>

其他可以编写自定义函数进行拆分

Oracle 一行拆分为多行的更多相关文章

  1. Sql一行拆分转多行

    select a.planid,b.mias, miaid into [1_cache3] from (select planid,mias=convert(xml,'<root>< ...

  2. Oracle一列的多行数据拼成一行显示字符

    Oracle一列的多行数据拼成一行显示字符   oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数.    www.2cto.com   先介绍:WMSYS.WM_CO ...

  3. mysql根据逗号将一行数据拆分成多行数据

    mysql根据逗号将一行数据拆分成多行数据 原始数据 处理结果展示 DDL CREATE TABLE `company` ( `id` ) DEFAULT NULL, `name` ) DEFAULT ...

  4. Oracle数据库字段数据拆分成多行(REGEXP_SUBSTR函数)

    做多选功能时为了简便,会在某个字段中存储多个值,保存时虽然省事,但后续的查询统计时还需要拆分数据才行,因此这时需要将字段内的值分成多行以便后续使用. 下面这个例子实现了字段内数据的拆分: --创建测试 ...

  5. Oracle 字段拆分替换在合并成一条

    看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...

  6. POI中getLastRowNum() 和getLastCellNum()的区别 hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1

    hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1

  7. SQL SERVER 拆分列为多行

    --创建测试表 )) insert into #temp(names) values('张三,李四'), ('中国,美国,巴西'), ('深圳,上海,北京,广州,哈尔滨'), ('足球,篮球,乒乓球, ...

  8. 利用jquery表格添加一行并在每行第一列大写字母显示实现方法

    表格添加一行并在每行第一列大写字母显示jquery实现方法 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...

  9. Pandas: 如何将一列中的文本拆分为多行? | Python

    Pandas: 如何将一列中的文本拆分为多行? 在数据处理过程中,经常会遇到以下类型的数据: 在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行. 在上图中,列名 ...

随机推荐

  1. bzoj 2330 [SCOI2011]糖果 差分约束模板

    题目大意 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...

  2. La 4670 AC自动机(模版)

    #include<iostream> #include<cstring> #include<queue> #include<cstdio> #inclu ...

  3. 换教室(bzoj 4720)

    Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的 ...

  4. h5页与ios通信

    直接上代码 1 粘第一段 //ios function setupWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBri ...

  5. TinyXML2使用教程(转)

    原文转自 http://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple.small.effic ...

  6. strace工具的实现原理【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044539 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] ...

  7. Android 禁止状态栏下拉status bar

    如果你有这样的需求:用户进入你的app以后,所有的操作都是你的app中设定的,用户不可以拥有系统设置等行为的能力.然而,Android系统,可以通过从顶部往下拉,从而得到一个通知和快速系统设置的页面: ...

  8. bootstrapTable 应用小例(收索)

    <script src="/plugins/My97DatePicker/WdatePicker.js"></script> <!-- Content ...

  9. HDU 5046 Airport【DLX重复覆盖】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...

  10. tomcat7.0.55配置单向和双向HTTPS连接

    HTTPS配置中分为单向连接和双向连接,单向连接只需要服务器安装证书,客户端不需要,双向连接需要服务器和客户端都安装证书 下面的配置都没有用CA签名来配置,都不能用于生产环境,实际配置中是需要CA的, ...