需求是:从其他接口接过来的数据,有个字段存的数据类似是‘紧急订单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
上面两个例子,一个是工作遇到的,一个是书上的,有时可以结合使用,视具体情况而定