J'ai une grande table avec des numéros de téléphone. Les numéros de téléphone sont tous des chaînes et sont censés être '+9628789878' ou similaire. (un signe "+" suivi de 9 à 13 chiffres.)
Un bug utilisateur a découvert une ligne avec la chaîne "+ 987 + 9873678298". De toute évidence, cela ne devrait pas être là et j'aimerais savoir combien d'autres cas il y a de cette erreur ou d'autres.
J'ai essayé cette requête mais elle ne fait pas le travail. Ma pensée est tout ce qui n'est pas comme cette chaîne. (Oh, la table n'est pas indexée par numéro_téléphone.)
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
Si vous devez trouver toutes les lignes où phone_number
n'est pas fait exactement par un '+'
suivi de 9-13 chiffres, cela devrait faire le travail:
select *
from users
where not regexp_like(phone_number, '^\+[0-9]{9,13}$')
Ce qu'il fait:
^
le début de la chaîne, pour éviter des choses comme 'XX +123456789'
\+
le '+'[0-9]{9,13}
une séquence de 9-13 chiffres$
la fin de la chaîne, pour éviter les chaînes comme '+123456789 XX'
Une autre façon, sans expression rationnelle, pourrait être la suivante:
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'), '+') = '+'
)
Cela pourrait être plus rapide que l'approche regexp, même si elle est basée sur plus de conditions, mais je crois que seul un test vous dira laquelle est la plus performante.