当前位置:首页 > Oracle > 正文内容

Oralce开发技巧之过虑字符

管理员11年前 (2009-09-10)Oracle268

从客户那里拿来一个 Excel 表格,数据比较多,说是让好几个人加班几个晚上整理出来的,让直接导入到数据库中,数据的来源多样化,有的从网上页上粘出来的,有手工录入的,也有从 Word 中粘过来的,有好多数字列,里面混杂了很多的特殊字符,在数据库中建了临时表,先把数据粘进来后,数字列也是建成了字符列,就是在导入业务表是太多的数据不能转换成数字,之前几个还手工改改,后来发现这个不是个办法,工作量太大了,只能想办法把数据完全规范后,再处理。

首先想到的是,数字列中包含的空格比较多了,可以用 Replace 来把空格剔除,空格处理完后,发现还有全角的空格,又 Replace 一次,又发现有换行符 chr(13) ,又Replace 一次,又发现。。。,替换多次,还是不能通过,有点困难了,有没有一个什么样的函数可以把非数字的字符都去掉呢,此时想到 translate ,这个可以替换一个序列为另外一个序列,这里需要把所有的非数字的字符拼成一个源串,统一替换成NULL,从而达到删除所有非数字的目的。

思路基本上出来,先得到源串中的非数字的所有字符,也就是滤过这个串中的所有数字字符,再用这个结果去替换最原先的串。

下面看一个例子:

SQL> select object_name from user_objects where rownum <10 ;
OBJECT_NAME
-------------------------------------------------------------
/1005bd30_LnkdConstant
/10076b23_OraCustomDatumClosur
/10297c91_SAXAttrList
/103a2e73_DefaultEditorKitEndP
/1048734f_DefaultFolder
/10501902_BasicFileChooserUINe
/105072e7_HttpSessionBindingEv
/106ba0a5_ArrayEnumeration
/106faabc_BasicTreeUIKeyHandle

已选择9行。

SQL>

1、过滤掉所有的数字,只留下非数字的内容。

SQL> col object_name format a35
SQL> col result format a35
SQL> select object_name , 
  2  translate(object_name,'#1234567890.','#') as result
  3  from user_objects 
  4  where rownum < 10 ;


OBJECT_NAME                         RESULT
----------------------------------- ------------------------------
/1005bd30_LnkdConstant              /bd_LnkdConstant
/10076b23_OraCustomDatumClosur      /b_OraCustomDatumClosur
/10297c91_SAXAttrList               /c_SAXAttrList
/103a2e73_DefaultEditorKitEndP      /ae_DefaultEditorKitEndP
/1048734f_DefaultFolder             /f_DefaultFolder
/10501902_BasicFileChooserUINe      /_BasicFileChooserUINe
/105072e7_HttpSessionBindingEv      /e_HttpSessionBindingEv
/106ba0a5_ArrayEnumeration          /baa_ArrayEnumeration
/106faabc_BasicTreeUIKeyHandle      /faabc_BasicTreeUIKeyHandle

已选择9行。

SQL>

-- 2010-05-05 补充

-- 使用正则表达式来过滤掉所有的数字
regexp_replace(c, '[0-9]', '') c

2 、只保留数字,其他字符全部过滤掉。

SQL> select object_name ,
  2  translate(object_name , '#' || translate(object_name,'#1234567890.','#') ,#') as result
  3  from user_objects 
  4 where rownum < 10 ;

OBJECT_NAME                         RESULT
----------------------------------- ------------------------------
/1005bd30_LnkdConstant              100530
/10076b23_OraCustomDatumClosur      1007623
/10297c91_SAXAttrList               1029791
/103a2e73_DefaultEditorKitEndP      103273
/1048734f_DefaultFolder             1048734
/10501902_BasicFileChooserUINe      10501902
/105072e7_HttpSessionBindingEv      1050727
/106ba0a5_ArrayEnumeration          10605
/106faabc_BasicTreeUIKeyHandle      106
已选择9行。

SQL>

-- 2010-05-05 补充

-- 使用正则表达式来保留所有的数字
regexp_replace(c, '[^0-9]', '') c
打赏 支付宝打赏 微信打赏
    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由卖水果的net发布,如需转载请注明出处。

    转载请注明出处:http://www.msgde.net/oracle/oracle_translate_number.html

    分享给朋友:

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。