帖子内容
http://topic.youkuaiyun.com/u/20120202/07/780689b5-4357-4688-91cb-02f7adcc3eab.html
表:
字段:NAME ID
AAA 1,2,3
BBB 1,2
结果:
NAME ID
AAA 1
AAA 2
AAA 3
BBB 1
BBB 2
============================================
(兰兰)
select name,regexp_substr(id,'[^,]+',1,n)
from test_a left join
(select level,rownum n from dual connect by level < 10) on 1=1
where regexp_substr(id,'[^,]+',1,n) is not null
=============================================
在大神级别的同事帮助下终于是搞明白了,哈哈,小自豪下,下面进入主题
首先来看
select level,rownum n from dual connect by level < 10
该结果为:
LEVEL n
-------------- ------------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
这样就应该知道
select name,id
from test_a left join
(select level,rownum n from dual connect by level < 10) on 1=1
的结果是什么了!
在来看regexp_substr(id,'[^,]+',1,n)
regexp_substr是同过正则表达式来拆分字符串的函数,用法见http://hi.baidu.com/wangzhiqing999/blog/item/625958917f5b5158d1135eff.html
看"[^,]+"这条正则表达式,其作用就是从字符串的开始位置进行匹配","
比如"2,3,4,5,6"
当第一次查找,也就是dual查找结果中的第一条记录,即n=1,那么就是regexp_substr(id,'[^,]+',1,1) —— 结果为2
当第三次查找,也就是dual查找结果中的第一条记录,即n=3,那么就是regexp_substr(id,'[^,]+',1,3) ——结果为4
当第6次查找,也就是dual查找结果中的第一条记录,即n=6,那么就是regexp_substr(id,'[^,]+',1,6) ——结果为空,此时不满足
where regexp_substr(id,'[^,]+',1,n) is not null
的条件,故不计入结果
进而实现了字符串的分割,也实现的对结果的过滤,实现了题目的需求。
但仍有一点不太懂,如果输入的id中的","个数超过10个呢??
正则表达式我也不太熟,具体看参照http://www.yesky.com/imagesnew/software/vbscript/html/jsgrpRegExpSyntax.htm
===============================
别问我connect by 是干什么的,我也不太清楚,据说是什么什么树,百度了一下也没看明白。
本文详细解析了SQL查询中使用regexp_substr函数的原理、应用实例以及如何通过正则表达式实现字符串的分割与过滤。同时,讨论了在特定场景下,如输入id中的逗号数量超过预设值时的处理方式。
14万+

被折叠的 条评论
为什么被折叠?



