web-dev-qa-db-ja.com

Oracle:文字列内の非数値文字の置換

データベースにユーザーが自由形式の電話番号を保存するフィールドがあります。結果として、データにはあらゆる種類の異なるフォーマットがあります。

  • (エリア)nnn-nnnn
  • エリア-nnn-nnnn
  • area.nnn.nnnn

数字以外の文字をすべて削除して、数字を保存したいのですが、これを行う簡単な方法が見つかりません。各文字に1つのREPLACEを使用しなくても可能ですか?

26
chris

Oracle 10以降では REGEXP_REPLACE を使用できます。

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

この例は、349471234562013を返します。

代替構文は次のとおりです。

  • POSIX文字クラス:

    '[^[:digit:]]+'
    
  • Perlの影響を受ける拡張機能(Oracle 11以降):

    '\D+'
    
57

正規表現をサポートしない古いバージョンのOracleの場合:

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

内側のtranslateは電話番号からすべての非数字文字を取得し、外側のtranslateは電話番号からそれらを削除します。

12
Tony Andrews