在Oracle中字符串的顺序分组

我的任务是将类似的数字/一个给定的字符串中的字符,例如为:在SQL字符串的输出4455599应该是44 555 99 ,并正在与下面的查询:

with t(str) as ( select '4455599' from dual ) select listagg(str_grouped ,' ') within group (order by rownum) str_split from( select listagg ( str) within group ( order by lvl) str_grouped from( select level lvl, substr(str,level,1) str, dense_rank() over( order by substr(str,level,1)) drank_no from t connect by level <= length(str) ) group by drank_no );

但查询作为我目前正在使用失败,出现以下数据dense_rank

445559944 ,预计44 555 99 44 ,但得到4444 555 99

bb119911 ,预计bb 11 99 11 ,但得到1111 99 bb

帮助我在此,欢迎所有的正则表达式查询。

--------------解决方案-------------

反向引用救援:

select
regexp_replace('4455599', '((.)\2*)', '\1 ')
from dual;

输出:

44 555 99

说明

((.)\2*)定义了两个捕获组,其中:

(.)匹配任何单个字符并捕捉它第2组。

\2*是一个反向引用到第2组捕获的性格,这零次或多次匹配相同的字符。

((.)\2*)因此匹配一个或更多的同一字符的序列,并在第1组捕获序列。

\1替换为第1组中的内容匹配的字符,后面有一个空格。

反向引用是由左到右从1开始计数(组0是整场比赛)。 因此,如果你有图案(((a)b)c)d最里面(a)是基团3, ((a)b)是第2组, (((a)b)c)是第1组,和如果您使用的是正常的正则表达式引擎(不包括Oracle的),整个模式(((a)b)c)d在组0抓获。

测试用例

select
val, regexp_replace(val, '((.)\2*)', '\1 ') as result
from (
select '445559944' as val from dual
union all select 'bb119911' as val from dual
union all select '46455599464' as val from dual
) foo;

输出:

VAL RESULT
----------- ------------------
445559944 44 555 99 44
bb119911 bb 11 99 11
46455599464 4 6 4 555 99 4 6 4

分类:SQL 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.192 (s). 10 q(s)