ton*_*nyf 1 regex oracle oracle11g regexp-substr
我在Oracle 11g中使用REGEXP_SUBSTR,我在尝试提取以下字符串时遇到困难.
我的查询是:
SELECT regexp_substr('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', '[^CN=]*\,', 1, rownum) line
FROM dual
CONNECT BY LEVEL <= length('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,') -
length(REPLACE('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', ',', ''))
Run Code Online (Sandbox Code Playgroud)
从这个查询,我有问题尝试匹配精确字符串'CN ='从此查询,我需要输出显示如下:
CN=aTIGERAdmin-Admin,
CN=D0902498,
CN=ea90045052,
CN=aTIGERCall-Admin,
Run Code Online (Sandbox Code Playgroud)
并以这种格式,最后用逗号.
我现在这样做的方式是切断"CN =",但实际上我需要这部分.
我认为这将返回您正在寻找的结果集:
SELECT REGEXP_SUBSTR(d.s,'CN=.*?,', 1, ROWNUM) line
FROM (SELECT 'CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,'
AS s FROM dual) d
CONNECT BY LEVEL <= LENGTH(d.s) - LENGTH(REPLACE(d.s,',',''))
Run Code Online (Sandbox Code Playgroud)
这里使用的正则表达式技巧是指定?修饰符(跟随.*)以使匹配"非贪婪".默认匹配(没有?修饰符)是"贪婪",因为它将匹配尽可能多的字符串.在您的情况下,您希望匹配结束于找到的第一个逗号.这里的目的是匹配文字字符串'CN =',后跟任意数量的字符(零,一个或多个),直到遇到的第一个逗号.
这适用于Oracle 10g以及11g.
在11g中,REGEXP_COUNT函数可以替换您的"计数"计算事件.
CONNECT BY LEVEL <= REGEXP_COUNT(d.s,'CN=.*?,')
Run Code Online (Sandbox Code Playgroud)
(顺便说一句......通过使用子查询返回文字字符串,文字字符串只需要指定一次.这样可以更容易地更改字符串以进行测试,而不必在多个位置更改它.)
附录:
我可以确认逗号包含在返回值中.样本输出:
LINE
-----------------------
CN=aTIGERAdmin-Admin,
CN=D0902498,
CN=ea90045052,
CN=aTIGERCall-Admin,
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4071 次 |
| 最近记录: |