我有一张带电话号码的大桌子。电话号码都是字符串,应该是'+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
答案 0 :(得分:16)
如果您需要查找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'), '+') = '+'
)
这可能比正则表达式方法更快,即使它基于更多条件,但我相信只有一个测试会告诉你哪一个是最佳表现。