oracle 10g 使用REGEXP_SUBSTR 分拆字符串
2011-04-15 16:41
387 查看
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;
后边一种很奇怪,先存起来,有空再来研究吧
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 10g 使用REGEXP_SUBSTR 分拆字符串
- Oracle 10g 使用REGEXP_SUBSTR 分拆字符串 (转)
- 动态传入的逗号连接的字符串,分散成多条记录(Oracle 10g 使用REGEXP_SUBSTR 分拆字符串)
- oracle 使用REGEXP_SUBSTR正则表达式拆分字符串
- oracle里面的时间转字符串to_char(),字符串转时间to_date(),以及substr和instr的使用。
- oracle中REGEXP_SUBSTR方法的使用
- Oracle中如何使用REGEXP_SUBSTR,listagg函数
- oracle中REGEXP_SUBSTR方法的使用
- Oracle的REGEXP_SUBSTR函数简单使用方法
- Oracle 中使用 Regexp_substr 和 Connect By 来根据分隔符进行列转行操作示例
- Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数
- Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子
- oracle 截取字符串substr(),REGEXP_SUBSTR()
- oracle REGEXP_SUBSTR实现字符串转列
- 【SQL】10g字符串处理函数regexp_substr的用法示例2
- Oracle分割字符串 REGEXP_SUBSTR用法
- Oracle分割字符串中的所有逗号 REGEXP_SUBSTR
- Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子
- oracle REGEXP_SUBSTR实现字符串转列
- oracle使用regexp_substr函数将字符串拆分成集合