Prova qualcosa del genere:
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
);
Se trovate motivi validi ma non coperti dalla query, aggiungeteli alle parti e ai pezzi mostrati. Se trovi qualcosa che deve essere unito nelle due parti, modellalo dopo l'Extension CTE (che manca o una combinazione di Ext1 ed Ext2). Se hai bisogno di supportare numeri internazionali, e hanno schemi diversi (non corrispondenti agli Stati Uniti 3-3-4), allora avrai bisogno di alcune analisi e correlazioni adeguate per far corrispondere i giusti codici di paesi con gli schemi giusti. Ad esempio, so che in alcune parti del Brasile, questo è un numero valido: +55 85 1234-5678 (prefisso 55, prefisso due cifre, quindi schema 4-4).
Un'altra tecnica per aiutarti ad analizzare i tuoi dati è questa:
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;
Questo può aiutarti a capire come sono i tuoi dati ignorando le effettive differenze del numero di telefono tra ogni riga e prestando attenzione solo alla disposizione e al conteggio delle cifre. Se ci sono molti caratteri alfa, prova a iniziare a sostituire modelli validi (come "ext") con un valore non trovato nell'elenco, quindi puoi comprimere il resto dell'input spurio in qualcosa che può essere analizzato con un simile Replace()
per ogni lettera dell'alfabeto.