Hãy thử một cái gì đó như thế này:
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
);
Nếu bạn tìm thấy các mẫu hợp lệ nhưng không nằm trong truy vấn, hãy thêm chúng vào các phần và phần được hiển thị. Nếu bạn tìm thấy một cái gì đó cần phải được kết hợp trong hai phần, sau đó mô hình hóa nó sau CTE mở rộng (thiếu hoặc kết hợp giữa Ext1 và Ext2). Nếu bạn cần hỗ trợ các số quốc tế và chúng có các mẫu khác nhau (không khớp với 3-3-4 của Hoa Kỳ) thì bạn sẽ cần một số phân tích và tương quan phù hợp để làm cho mã quốc gia phù hợp với các mẫu phù hợp. Ví dụ: tôi biết rằng ở một số khu vực nhất định của Brazil, đây là một số hợp lệ: +55 85 1234-5678 (mã quốc gia 55, mã vùng hai chữ số, sau đó là mẫu số 4).
Một kỹ thuật khác để giúp bạn phân tích dữ liệu của mình là:
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;
Điều này có thể giúp bạn hiểu dữ liệu của mình như thế nào bằng cách bỏ qua sự khác biệt về số điện thoại thực tế giữa mỗi hàng và chỉ chú ý đến việc sắp xếp và đếm số chữ số. Nếu có nhiều ký tự alpha, hãy thử bắt đầu thay thế các mẫu hợp lệ (chẳng hạn như "ext") bằng một giá trị không tìm thấy trong danh sách, để bạn có thể thu gọn phần còn lại của đầu vào giả thành thứ gì đó có thể được phân tích tương tự Replace()
cho mỗi chữ cái trong bảng chữ cái.