我的数据库中有一个用户保存了自由格式电话号码的字段。因此,数据具有各种不同的格式:
我想删除所有非数字字符并只存储数字,但我找不到一个简单的方法来执行此操作。是否可以不为每个字符使用一个REPLACE?
答案 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
将其从电话号码中删除。