oracle 匹配字母,oracle regexp_substr正则表达式笔记

要求:测试数据中c1列包括数值和单位,要求把单位和数值切割。

1、创建测试表

create table t1(c1 varchar2(100));

2、插入测试数据

insert into t1 values('10ML');

insert into t1 values('10KG');

insert into t1 values('10cm2');

insert into t1 values('0.4g');

select *   from t1;

OMFWEluml9kAAAAASUVORK5CYII=

3、切割数值和单位的SQL:

3.1 切割思路:

3.1.1 数值切割:如果数值中不包含小数点,使用regexp_substr(c1,'[[:digit:]]+')切割出C1列的数字即可;如果数值中包含小数点,先切割出小数点前面的数字,

然后拼接点号,再切割小数点后面的数字拼接到点号后面。

SQL:

decode(regexp_instr(c1,'\.'),0,regexp_substr(c1,'[[:digit:]]+'),

regexp_substr(c1,'[[:digit:]]+')||'.'||regexp_substr(c1,'[[:digit:]]+',regexp_instr(c1,'\.'))

)  c1_val

3.1.2 切割单位:先把C1列中的点号清除,然后匹配出单位。这里单位有两种一是纯字母的,另一种是字母加数字的如cm2。

regexp_substr使用或运算符(|)执行匹配时,匹配的情况如下,先第一个表达式匹配,如果匹配成功,匹配操作结束(不会在执行后面的表达式匹配),如果第一个表达式匹配不到数据,则使用第二个表达式进行匹配,如果第二个表达式匹配成功,返回第二个表达式匹配到的值。如果两个表达式都没匹配成功则返回空。

[^[:digit:]]+[[:digit:]]+表达式包含[^[:digit:]]+ 表达式,所以把[^[:digit:]]+[[:digit:]]+放在[^[:digit:]]+的前面避免[^[:digit:]]+ 放在前面cm2被[^[:digit:]]+ 匹配出cm后不再执行[^[:digit:]]+[[:digit:]]+ 匹配。所以regexp_substr(regexp_replace(c1,'\.',''),'[^[:digit:]]+[[:digit:]]+|[^[:digit:]]+')使用正则表达式匹配单位时需要把匹配字母加数字的表达式写在只匹配字母的表达式前面。

切割SQL如下:

select

decode(regexp_instr(c1,'\.'),0,regexp_substr(c1,'[[:digit:]]+'),

regexp_substr(c1,'[[:digit:]]+')||'.'||regexp_substr(c1,'[[:digit:]]+',regexp_instr(c1,'\.'))

)  c1_val,

regexp_substr(regexp_replace(c1,'\.',''),'[^[:digit:]]+[[:digit:]]+|[^[:digit:]]+')  c1_dw

from t1;

A94EIr9q4l8FAAAAAElFTkSuQmCC

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21582653/viewspace-1096888/,如需转载,请注明出处,否则将追究法律责任。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值