Essayez quelque chose comme ceci:
WITH AreaCode (A) AS (
SELECT '[0-9][0-9][0-9][-.]'
UNION ALL SELECT '([0-9][0-9][0-9])-'
), Prefix (P) AS (
SELECT '[0-9][0-9][0-9]-'
), Last4 (L) AS (
SELECT '[0-9][0-9][0-9][0-9]'
), Ext1 (E1) AS (
SELECT ' x'
UNION ALL SELECT ' Ext.'
UNION ALL SELECT ' ext'
), Ext2 (E2) AS (
UNION ALL SELECT '[0-9][0-9]'
UNION ALL SELECT '[0-9][0-9][0-9]'
UNION ALL SELECT '[0-9][0-9][0-9][0-9]'
), Extension (E) AS (
SELECT ''
UNION ALL SELECT E1 + E2 FROM Ext1 CROSS JOIN Ext2
),
SELECT *
FROM
YourTable Y
WHERE NOT EXISTS (
SELECT *
FROM
AreaCode
CROSS JOIN Prefix
CROSS JOIN Last4
CROSS JOIN Extension
WHERE
Y.PhoneNumber LIKE AreaCode + Prefix + Last4 + Extension
);
Si vous trouvez des modèles valides mais non couverts par la requête, ajoutez-les aux pièces et pièces affichées. Si vous trouvez quelque chose qui doit être ensemble dans les deux parties, modélisez-le après l'Extension CTE (qui est manquant ou une combinaison de Ext1 et Ext2). Si vous devez prendre en charge les numéros internationaux et qu'ils ont des modèles différents (ne correspondant pas aux États-Unis 3-3-4), vous aurez besoin d'une analyse et d'une corrélation appropriée pour que les bons codes de pays correspondent aux bons modèles. Par exemple, je sais que dans certaines régions du Brésil, il s'agit d'un numéro valide: +55 85 1234-5678 (indicatif de pays 55, indicatif régional à deux chiffres, puis motif 4-4).
Une autre technique pour vous aider à analyser vos données est la suivante:
WITH Patterns (P) AS (
SELECT
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(
PhoneNumber,
'1', '0'), '2', '0'), '3', '0'), '4', '0'),
'5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'
)
)
SELECT P, Count(*)
FROM Patterns
GROUP BY P;
Cela peut vous aider à comprendre à quoi ressemblent vos données en ignorant les différences réelles de numéro de téléphone entre chaque ligne et en faisant attention uniquement à la disposition et au nombre de chiffres. S'il y a beaucoup de caractères alpha, essayez de commencer à remplacer les modèles valides (tels que "ext") par une valeur introuvable dans la liste, afin de pouvoir réduire le reste de l'entrée parasite en quelque chose qui peut être analysé avec un similaire Replace()
pour chaque lettre de l'alphabet.