2017-03-01 123 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'), '+') = '+' 
         ) 
    

    这可能是比正则表达式的方法更快,即使它是基于多个条件,但我相信只是一个测试会告诉你哪一个是最佳表演。