您的位置:首页 > 数据库 > Oracle

oracle中的正则表达式

2015-08-21 16:04 701 查看
1.regexp_replace

   相当于同时执行了多个replace()函数;

比如提取姓名的大写字母

create view v

as select 'Aa.Bb' as a1 from dual;

select regexp_replace(v.a1,'([[:upper:]])(.*)([[:upper:]])(.*)','\1.\3') as a2 from v;

在这个查询中,将字符串分成了四组,1,3中为大写字母,然后用'\1.\3'分别取大写字母,并在中间加了‘.’;

2.regexp_like

比如查询只包含字母或数字型的数据

select a from v

where regexp_like(a,'^[0-9a-zA-Z]+$');

注:"$"该符号在方括号外,表示字符串的结束。

regexp_like对应普通的like

1.regexp_like(a,'A')对应like'%A%';

2.regexp_like(a,'^A')对应like'A%,没有前模糊查询';

3.regexp_like(a,'A$')对应like'%A',没有后模糊查询;

4.regexp_like(a,'^A$')对应like'A',精确查询;

另外+和*

regexp_like(str,'12+')相当于like'12%';

regexp_like(str,'12*')相当于like'1%';

3.regexp_substr

用来提取第n个分隔的子串

select regexp_substr(v.name,'[^,]+',1,2) as 子串 from v;

参数1:^在方括号里表示否的意思,+表示匹配1次以上,'[^,]+'表示匹配不包含逗号的多个字符,也就是各个子串

参数2:1表示从第一个字符开始

参数3:2表示第二个能匹配'[^,]+'的字符串,也就是第二个字符

4.按字母顺序排列字符串

比如字符串DBAA,按顺序转换成AABD

select ename,(select listagg(substr(ename,level,1) within group(order by substr(ename,level,1))

                       from dual

                       connect  by level<=length(ename)) as new_name

from tabname;

同样可以去重,我们可以在标量子查询里加一个group by即可

注:把"substr(ename,level,1)"当成一个整体min(substr(ename,level,1))

5.判别可作为数值的字符串

select to_number(mixed) as mixed

from (select regexp_replace(mixed,'[^0-9]','') as mixed from v)

where mixed is not null;



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息