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;