抽取、清洗varchar2到number类型数据的方法(由繁到简)

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46116695

 

【背景】

        进行数据抽取时,抽取“联系电话”字段时,发现存在部分中文、英文,需要对该字段进行清理。

【垃圾数据存在原因】

        如果有“联系电话”这样的字段,在设计之初就设置为number,而不是设置成varchar2,再在前端软件做一个约束,相信就不会有这样存在英文或中文的干扰,也就不会出现垃圾数据了。而如今,遇到了,只好想办法处理了。

【解决过程】

        开始想复杂了,想要用一个函数做判断,然后再利用case处理,但后来得到其它公司的DBA提示,用了个正则表达式就搞定了,诶呀!

 

下面模拟做个试验:

1、创建实验表(源端)

create  table test_num

(

tel varchar2(32)

);

2、创造些实验数据(源端)

3、创建实验目标表(目标端)

create  table  test_num_new

(

tel number

);

4、由源端向目标端插入数据

5、创建判断函数

create  or  replace function  isnum(v_invarchar2)

returnvarchar is

val_err  exception;

pragma exception_init(val_err,-6502);

scrub_num number;

begin

 scrub_num := to_number(v_in);

 return 'Y';

 exception when  val_err then

   return  'N';

   end;

   

函数作用:传递给isnum函数一个值,如果是number返回Y,如果不是number返回N

6、使用case,利用函数完成清洗

insert  into  test_num_new  select case  isnum(TEL) when 'Y' then  TEL

when 'N' then  ''

  end  from   test_num;

commit;

7、查看清洗后目标表效果

通过查看,完成了对于垃圾数据的清洗。但这么做是不是有些复杂呢?

换个思路,利用正则表达式。

8、清空目标数据

truncate  table  test_num_new;

9、利用正则表达式向目标表插入数据

insert into  test_num_new select   REGEXP_REPLACE(tel,'\D','')  from   test_num;

commit;

 

10、查看目标表

       可以看到利用正则表达式,处理过的数据,去除了中文、英文的干扰,只保存了number,达到预期效果,比之前的case与函数实现上,简化了不少。

实验完毕。

 

【小结】

利用正则表达式,只保留number去除中文、英文干扰。

语法:REGEXP_REPLACE(字段名或字符串,'\D','')

含义:把字段中非number的字符去掉

其中\D:表示非number字符。

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46116695

  

系列链接_20150523:

蓝的成长记——追逐DBA(1):奔波于路上,挺进山东 

蓝的成长记——追逐DBA(2):安装!安装!久违的记忆,引起我对DBA的重新认知

蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题 

蓝的成长记——追逐DBA(4):追忆少年情愁,再探oracle安装(Linux下10g、11g) 

蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

蓝的成长记——追逐DBA(6): 做事与做人:小技术,大为人

蓝的成长记——追逐DBA(7):基础命令,地基之石 

蓝的成长记——追逐DBA(8):重拾SP报告,回忆oracle的STATSPACK实验

蓝的成长记— —追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程

蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere 

蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来 

蓝的成长记——追逐DBA(12):七天七收获的SQL

蓝的成长记——追逐DBA(13):协调硬件厂商,六个故事:所见所感的“服务器、存储、交换机......”

蓝的成长记——追逐DBA(14):难忘的“云”端,起步的hadoop部署 

蓝的成长记——追逐DBA(15):以为FTP很“简单”,谁成想一波三折

蓝的成长记——追逐DBA(16):DBA也喝酒,被捭阖了

 

系列链接_20150528:

足球与oracle系列(1):32路诸侯点兵,oracle32进程联盟 之A组巴西SMON进程的大局观

足球与oracle系列(2):巴西揭幕战预演,oracle体系结构杂谈

足球与oracle系列(3):oracle进程排名,世界杯次回合即将战罢!

足球与oracle系列(4):从巴西惨败于德国,想到,差异的RAC拓扑对比!  

足球与oracle系列(5):fifa14游戏缺失的directX库类比于oracle的rpm包! 

足球与oracle系列(6):伴随建库的亚洲杯——加油中国队

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值