ลองสิ่งนี้:
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
);
หากคุณพบรูปแบบที่ถูกต้อง แต่ไม่ครอบคลุมโดยแบบสอบถามเพิ่มพวกเขาไปยังชิ้นส่วนและชิ้นส่วนที่แสดง หากคุณพบบางสิ่งที่จำเป็นต้องอยู่ด้วยกันในสองส่วนให้ทำแบบจำลองนี้หลังจาก 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()
สำหรับตัวอักษรแต่ละตัวในตัวอักษร