Wypróbuj coś takiego:
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
);
Jeśli znajdziesz wzory, które są prawidłowe, ale nie są objęte zapytaniem, dodaj je do pokazanych części i elementów. Jeśli znajdziesz coś, co musi być razem w dwóch częściach, zamodeluj to po rozszerzeniu CTE (którego brakuje albo kombinacji Ext1 i Ext2). Jeśli potrzebujesz obsługi numerów międzynarodowych, a mają one różne wzorce (niezgodne z amerykańskimi 3-3-4), potrzebujesz analizy i odpowiedniego skorelowania, aby dopasować odpowiednie kody krajów do odpowiednich wzorców. Na przykład wiem, że w niektórych częściach Brazylii jest to prawidłowy numer: +55 85 1234-5678 (kod kraju 55, numer kierunkowy dwie cyfry, a następnie wzór 4-4).
Kolejną techniką, która pomaga analizować dane, jest:
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;
Pomoże Ci to zrozumieć, jakie są twoje dane, ignorując rzeczywiste różnice numerów telefonów między poszczególnymi wierszami i zwracając uwagę tylko na układ i liczbę cyfr. Jeśli jest dużo znaków alfanumerycznych, spróbuj rozpocząć zastępowanie prawidłowych wzorców (takich jak „ext”) wartością, której nie ma na liście, abyś mógł zawinąć resztę fałszywych danych wejściowych w coś, co można przeanalizować za pomocą podobnego Replace()
dla każdej litery w alfabecie.