Oracle:替换字符串中的非数字字符

时间:2010-10-19 12:15:52

标签: oracle11g replace

我的数据库中有一个用户保存了自由格式电话号码的字段。因此,数据具有各种不同的格式:

  • (地区)nnn-nnnn
  • 区域-NNN-NNNN
  • area.nnn.nnnn

我想删除所有非数字字符并只存储数字,但我找不到一个简单的方法来执行此操作。是否可以不为每个字符使用一个REPLACE?

2 个答案:

答案 0 :(得分:57)

从Oracle 10开始,您可以使用REGEXP_REPLACE

SELECT REGEXP_REPLACE('+34 (947) 123 456 ext. 2013', '[^0-9]+', '')
FROM DUAL

此示例返回349471234562013

替代语法包括:

  • POSIX字符类:

    '[^[:digit:]]+'
    
  • 受Perl影响的扩展(自Oracle 11起):

    '\D+'
    

答案 1 :(得分:12)

对于不支持正则表达式的旧版Oracle:

select translate (phone_no,'0'||translate (phone_no,'x0123456789','x'),'0')
from mytable;

内部translate获取电话号码中的所有非数字字符,然后外部translate将其从电话号码中删除。