oracle板块的一个帖子小纠结了一下

本文详细解析了SQL查询中使用regexp_substr函数的原理、应用实例以及如何通过正则表达式实现字符串的分割与过滤。同时,讨论了在特定场景下,如输入id中的逗号数量超过预设值时的处理方式。

帖子内容 

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 是干什么的,我也不太清楚,据说是什么什么树,百度了一下也没看明白。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值