2017-03-01 7 views
3

私は電話番号の大きなテーブルを持っています。電話番号はすべて文字列で、 '+9628789878'などとなっています。OracleではREGEXP_LIKEではありません

ユーザーバグは、文字列「+ 987 + 9873678298」で1つの行を発見しました。明らかにそれはそこにあってはならないし、このようなエラーが他にもいくつあるのかを知りたい。

私はこのクエリを試しましたが、それは仕事をしていません。私の考えは、この文字列のようなものではないものです。 (ああ、テーブルはPHONE_NUMBERでインデックス化されていません。)

SELECT user_key, 
     first_name, 
     last_name, 
     phone_number 
FROM users u 
WHERE regexp_like(phone_number, '[^\+[0-9]*]') 
AND phone_number IS NOT NULL 
+1

無関係ですが、 'phone_number IS NOT NULL'は必要ありません。なぜならNULL値は' regexp_like'を通って通らないからです。 –

答えて

7

あなたは、これが作業を行う必要がありphone_numberは9-13桁の数字が続く'+'正確で行われていないすべての行を検索する必要がある場合:

それは何
select * 
from users 
where not regexp_like(phone_number, '^\+[0-9]{9,13}$') 

  • ^文字列の先頭、'XX +123456789'
  • のようなものを避けるために
  • \+「+」
  • [0-9]{9,13}'+123456789 XX'

のような文字列に別の方法を回避するために、9-13桁

  • $文字列の最後のシーケンス、無正規表現で、以下の可能性:

    where not (
           /* strings of 10-14 chars */ 
           length(phone_number) between 10 and 14 
           /* ... whose first is a + */ 
          and substr(phone_number, 1, 1) = '+' 
           /* ...and that become a '+' after removing all the digits */ 
          and nvl(translate(phone_number, 'X', 'X'), '+') = '+' 
         ) 
    

    これは、それがより多くの条件に基づいている場合でも、正規表現のアプローチよりも速いかもしれないが、私は唯一のテストがある1を教えてくれます信じています最高のパフォーマンス。

  • 関連する問題