原创作品,出自 “深蓝的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(2):安装!安装!久违的记忆,引起我对DBA的重新认知
蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题
蓝的成长记——追逐DBA(4):追忆少年情愁,再探oracle安装(Linux下10g、11g)
蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统
蓝的成长记——追逐DBA(6): 做事与做人:小技术,大为人
蓝的成长记——追逐DBA(8):重拾SP报告,回忆oracle的STATSPACK实验
蓝的成长记— —追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程
蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere
蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来
蓝的成长记——追逐DBA(13):协调硬件厂商,六个故事:所见所感的“服务器、存储、交换机......”
蓝的成长记——追逐DBA(14):难忘的“云”端,起步的hadoop部署
蓝的成长记——追逐DBA(15):以为FTP很“简单”,谁成想一波三折
系列链接_20150528:
足球与oracle系列(1):32路诸侯点兵,oracle32进程联盟 之A组巴西SMON进程的大局观
足球与oracle系列(2):巴西揭幕战预演,oracle体系结构杂谈
足球与oracle系列(3):oracle进程排名,世界杯次回合即将战罢!
足球与oracle系列(4):从巴西惨败于德国,想到,差异的RAC拓扑对比!
足球与oracle系列(5):fifa14游戏缺失的directX库类比于oracle的rpm包!
足球与oracle系列(6):伴随建库的亚洲杯——加油中国队