【问题标题】:Not REGEXP_LIKE in Oracle不是 Oracle 中的 REGEXP_LIKE
【发布时间】:2017-07-21 00:55:23
【问题描述】:

我有一张放着电话号码的大桌子。电话号码都是字符串,应该是“+9628789878”或类似的。 (“+”号后跟 9 到 13 位数字。)

一个用户错误发现了一行字符串“+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

【问题讨论】:

  • 不相关,但是:phone_number IS NOT NULL 是不必要的,因为 NULL 值无论如何都无法通过 regexp_like

标签: sql regex oracle


【解决方案1】:

如果您需要找到 phone_number 不是由 '+' 后跟 9-13 位数字组成的所有行,这应该可以完成工作:

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

它的作用:

  • ^ 字符串的开头,避免像 'XX +123456789' 这样的事情
  • \+ '+'
  • [0-9]{9,13} 9-13 位数字序列
  • $ 字符串的结尾,避免像'+123456789 XX' 这样的字符串

没有正则表达式的另一种方式可能如下:

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, 'X0123456789', 'X'), '+') = '+' 
          )

这可能比正则表达式方法更快,即使它基于更多条件,但我相信只有测试才能告诉您哪个是性能最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2019-07-21
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多