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)