Спробуйте щось подібне:
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
);
Якщо ви знайдете шаблони, які є дійсними, але не охоплені запитом, додайте їх до показаних частин та фрагментів. Якщо ви знайдете щось, що має бути разом у двох частинах, моделюйте його після розширення CTE (якого немає або комбінації Ext1 і Ext2). Якщо вам потрібно підтримувати міжнародні номери, і вони мають різні шаблони (не відповідають американським 3-3-4), тоді вам знадобиться певний аналіз та відповідне співвідношення, щоб правильні коди країн відповідали правильним зразкам. Наприклад, я знаю, що в певних частинах Бразилії це дійсне число: +55 85 1234-5678 (код країни 55, код міста дві цифри, потім шаблон 4-4).
Ще одна методика, яка допоможе вам проаналізувати свої дані, така:
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;
Це допоможе вам зрозуміти, як виглядають ваші дані, ігноруючи фактичні відмінності телефонних номерів між кожним рядком та звертаючи увагу лише на розташування та кількість цифр. Якщо альфа-символів багато, спробуйте почати замінювати дійсні шаблони (наприклад, "ext") значенням, яке не знайдено в списку, щоб ви могли згорнути решту помилкових входів на те, що можна проаналізувати аналогічним Replace()
для кожної літери в алфавіті.