替换replace,translate,rtrim,regexp_replace

      需求是:从其他接口接过来的数据,有个字段存的数据类似是‘紧急订单2013-01-04‘、‘正常2013-4-9’、‘PDE订单20140206’。。。。总之这个字段里的坑爹数值不是那么正常的 ,然后客户需求是希望这里中文和所谓的日期分开(英文和数字分开)显示,从这些个数值里可以看出,这所谓日期都不是规范的写法,然后前面的中文也是各不相同,如何分开呢???

select t1.channel_name from t1 ;
1 紧急订单2013-01-04
2 正常2013-4-9
3 PDE订单20140206

      函数rtrim(字段,’字符1‘)是截取字段,从右边开始,一旦遇到不是字符1里的任意一个符合条件的就停止,从而留下字段左边的

select rtrim(t1.channel_name,'0123456789-') from t1 ;
1	紧急订单
2	正常
3	PDE订单

此时我们获得字段左边的,而客户希望取得右边的,若使用ltrim,很难列举出所有的中文,故此时可以使用regexp_replace函数

函数regexp_replace(字段,参数1,参数2),参数1是用来进行匹配操作的正则表达式,参数2是一个字符串,该字符串用于替换字段中匹配的部分

select regexp_replace(t1.channel_name,rtrim(t1.channel_name,'0123456789-'),'') from t1;
1	2013-01-04
2	2013-4-9
3	20140206

综合起来就是

select rtrim(t1.channel_name,'0123456789-') chinese,regexp_replace(t1.channel_name,rtrim(t1.channel_name,'0123456789-'),'') time from t1; 
1	紧急订单	2013-01-04
2	正常	2013-4-9
3	PDE订单	20140206 

还有一个类似的替换,情况是:一个字段里是“ALLEN  30”这种,也希望分开

select t.mingzi from test_t1 t;
1	SMITH  20
2	ALLEN  30
3	WARD  30
4	JONES  20
5	MARTIN  30
6	BLAKE  30
7	CLARK  10
8	SCOTT  20
9	KING  10
10	TURNER  30
11	ADAMS  20
12	JAMES  30
13	FORD  20
14	MILLER  10

函数translate(字段,参数1,参数2),参数1,参数2可以是字符串,且一一对应

select translate('abce143bigu5','12345','opq') from dual;

1 abceoqbigu

释:这里的规则是1->o,2->p,3->q,4->空,5->空

所以在替换abce143bigu5时的步骤是,先看a,没有替换规则,故仍然是abce143bigu5

再看b,没有替换规则,故仍然是abce143bigu5

再看c,没有替换规则,故仍然是abce143bigu5

再看e,没有替换规则,故仍然是abce143bigu5

再看1,有规则,故是abceo43bjgu5

到了4,有规则,故是abce03bjgu5

到了3,有规则,故是abce0qbjgu5

到了b、i、g、u都没有规则,故是abce0qbjgu5

到了5,有规则,故是abceoqbigu

select translate(t.mingzi,'0123456789','#########') from test_t1 t;
1	SMITH  ##
2	ALLEN  ##
3	WARD  ##
4	JONES  ##
5	MARTIN  ##
6	BLAKE  ##
7	CLARK  ##
8	SCOTT  ##
9	KING  ##
10	TURNER  ##
11	ADAMS  ##
12	JAMES  ##
13	FORD  ##
14	MILLER  ##

 

然后可以用replce来替换#都成空

select replace(translate(t.mingzi,'0123456789','##########'),'#','') from test_t1 t;
1	SMITH  
2	ALLEN  
3	WARD  
4	JONES  
5	MARTIN  
6	BLAKE  
7	CLARK  
8	SCOTT  
9	KING  
10	TURNER  
11	ADAMS  
12	JAMES  
13	FORD  
14	MILLER 

然后结合原始数据,再次使用replace,来将原始数据里那些字母都替换成空,那么就只会留下数字

select replace(t.mingzi,replace(translate(t.mingzi,'0123456789','##########'),'#',''),'') from test_t1 t;
1	20
2	30
3	30
4	20
5	30
6	30
7	10
8	20
9	10
10	30
11	20
12	30
13	20
14	10

 

上面两个例子,一个是工作遇到的,一个是书上的,有时可以结合使用,视具体情况而定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值