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
4asdfa
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;
后边一种很奇怪,先存起来,有空再来研究吧
分享到:
相关推荐
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier) string :需要进行正则处理的字符串 pattern :进行匹配的正则表达式 position :起始位置,从第几个...
Oracle分析函数基本概念和语法总结及Regexp_***(regexp_substr,regexp_instr, regexp_like, regexp_replace, regexp_count)用法
oracle_10g正则表达式_REGEXP_LIKE_用法
ORACLE 正则表达式的使用(REGEXP_LIKE REGEXP_INSTR REGEXP_SUBSTR REGEXP_REPLACE)
一个字符串匹配、查找替换算法的代码,支持各种通配符
oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用
oracle 字符串 替换 regexp_replace
REGEXP_SUBSTR(text, pattern [,position [,occurence [,mode]]]) REGEXP_INSTR?(text, pattern [,position [,occurence [,return_end [,mode]]]]) REGEXP_REPLACE?(text, pattern, replace [,position [,occurence ...
oracle中REGEXP_REPLACE函数在mysql中的实现
本篇文章是对oracle正则表达式regexp_like的用法进行了详细的分析介绍,需要的朋友参考下
这里利用了函数 regexp_substr和connect by 及oracle的正则相关函数实现oracle分割字符串方法
Oracle 10g正则表达式详解,REGEXP_LIKE,REGEXP_INSTR,REGEXP_SUBSTR,REGEXP_REPLACE
oracle正则表达式学习,REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。
Oracle 总结的正则表达式并带有详细的例子与解释 对应优化语句很有帮助更能提高效率。 包括: REGEXP_LIKE , REGEXP_REPLACE , REGEXP_INSTR , REGEXP_SUBSTR 。
REGEXP_SUBSTR REGEXP_SUBSTR 函数使用正则表达式来指定返回串的起点和终点,返回与source_string 字符集中的VARCHAR2 或CLOB 数据相同的字符串。 语法: –1.REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 ...
Oracle 正则表达式参考手册 regexp_instr regexp_substr regexp_repalce regexp_like
Oracle数据库的两个字段值为逗号分割的字符串,例如:字段A值为“1,2,3,5”,字段B为“2”。 想获取两个字段的交集(相同值)2,获取两个字段的差集(差异值)1,3,5。 一、最终实现的sql语句 1、获取交集(相同值)...
许多情况下,由于程序中需要将行转为列展示,如果使用ORACLE那么这个资源适合你。