Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 10g 使用REGEXP_SUBSTR 分拆字符串

SELECT l_count, REGEXP_SUBSTR("add, daddf, dsdf, asdfa, dsfasd, dsfad","[^,]+",1,l_count) AS NAME
  FROM dual
      ,(SELECT LEVEL l_count FROM DUAL CONNECT BY LEVEL<=100)
WHERE l_count <=LENGTH("add, daddf, dsdf, asdfa, dsfasd, dsfad") - LENGTH(REPLACE("add, daddf, dsdf, asdfa, dsfasd, dsfad",","))+1查询结果为:
lcount   name
1            add
2            daddf
3            dsdf
4            asdfa
5            dsfasd
6             dsfad一种奇特的字符串拆分方法 create table t_test (id number, names varchar2(200));insert into t_test values (1,"a1,a2,a3,a4");
insert into t_test values (2,"b1,b2,b3");
insert into t_test values (3,"c1,c2,c3,c4,c5");目标输出:ID NAME
--- ----
  1 a1
  1 a2
  1 a3
  1 a4
  2 b1
  2 b2
  2 b3
  3 c1
  3 c2
  3 c3
  3 c4
  3 c5常规做法:
SELECT id
      ,REGEXP_SUBSTR(names,"[^,]+",1,l) AS NAME
  FROM t_test
      ,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100)
WHERE l <=LENGTH(names) - LENGTH(REPLACE(names,","))+1
ORDER BY 1,2;下面这种写法(从ASKTOM看来的),很奇怪地在T2中可以看到T1的列(如果不用TABLE,CAST,MULTISET就不行), T1和T2两个集合之间没有任何连接条件, 看起来像Correlated Subquery, 但它是写在from的地方: SELECT id
      ,column_value
  FROM (SELECT id,","||names||"," names FROM t_test) t1     ----- 前后拼上逗号是为了下面定位拆分
      ,TABLE(CAST(MULTISET( SELECT SUBSTR (names            ----- 此处竟然可以看到t1.names
                                          ,INSTR (names, ",", 1, LEVEL  ) + 1
                                          ,INSTR (names, ",", 1, LEVEL+1) - INSTR (names, ",", 1, LEVEL) -1
                                          )
                              FROM DUAL
                            CONNECT BY LEVEL <= LENGTH(names)-LENGTH(REPLACE(names,",",""))-1
                           )
             AS SYS.ODCIVARCHAR2LIST ) ------ SYS.ODCIVARCHAR2LIST 可以换成任意一个TABLE OF VARCHAR2的嵌套表类型
             ) t2
ORDER BY 1,2;Oracle创建用户并设置权限Oracle表空间相关查询相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数