2017-03-01 55 views
3

我有一個帶電話號碼的大表。電話號碼都是字符串,應該是'+9628789878'或類似的。 (後跟9和13位數字的「+」號)。Oracle中不是REGEXP_LIKE

用戶錯誤發現了一行字符串'+ 987 + 9873678298'。很明顯,它不應該在那裏,我想知道還有多少其他這種或其他類似的錯誤。

我試過這個查詢,但它沒有做這項工作。我的想法是任何不像這個字符串。 (呵呵,表不被索引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'), '+') = '+' 
         ) 
    

    這可能是比正則表達式的方法更快,即使它是基於多個條件,但我相信只是一個測試會告訴你哪一個是最佳表演。