Intenta algo como esto:
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 encuentra patrones que son válidos pero no están cubiertos por la consulta, agréguelos a las partes y piezas que se muestran. Si encuentra algo que necesita estar junto en las dos partes, entonces modeléelo después de la Extensión CTE (que falta o una combinación de Ext1 y Ext2). Si necesita admitir números internacionales y tienen patrones diferentes (que no coinciden con los Estados Unidos 3-3-4), necesitará un análisis y una correlación adecuada para que los códigos de país correctos coincidan con los patrones correctos. Por ejemplo, sé que en ciertas partes de Brasil, este es un número válido: +55 85 1234-5678 (código de país 55, código de área de dos dígitos, luego patrón 4-4).
Otra técnica para ayudarlo a analizar sus datos es esta:
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;
Esto puede ayudarlo a comprender cómo son sus datos al ignorar las diferencias de números de teléfono reales entre cada fila y prestar atención solo a la disposición y el recuento de dígitos. Si hay muchos caracteres alfabéticos, intente comenzar a reemplazar patrones válidos (como "ext") con un valor que no se encuentre en la lista, para que pueda colapsar el resto de la entrada espuria en algo que pueda analizarse con un valor similar. Replace()
para cada letra del alfabeto