データベースにユーザーが自由形式の電話番号を保存するフィールドがあります。結果として、データにはあらゆる種類の異なるフォーマットがあります。
数字以外の文字をすべて削除して、数字を保存したいのですが、これを行う簡単な方法が見つかりません。各文字に1つのREPLACEを使用しなくても可能ですか?
Oracle 10以降では REGEXP_REPLACE を使用できます。
SELECT REGEXP_REPLACE('+34 (947) 123 456 ext. 2013', '[^0-9]+', '')
FROM DUAL
この例は、349471234562013
を返します。
代替構文は次のとおりです。
POSIX文字クラス:
'[^[:digit:]]+'
Perlの影響を受ける拡張機能(Oracle 11以降):
'\D+'
正規表現をサポートしない古いバージョンのOracleの場合:
select translate (phone_no,'0'||translate (phone_no,'x0123456789','x'),'0')
from mytable;
内側のtranslate
は電話番号からすべての非数字文字を取得し、外側のtranslate
は電話番号からそれらを削除します。