วิธีที่ดีที่สุดในการค้นหาจำนวนระเบียนที่ไม่มีหมายเลขโทรศัพท์ที่เหมาะสมใน SQL Server คืออะไร?


11

ฉันมีสาขาที่ผู้คนในอดีตสามารถใช้เพื่อให้คุณค่าได้อย่างอิสระ ฉันต้องระบุระเบียนที่ไม่มีค่าที่เหมาะสมเพื่อให้ฉันสามารถทำความสะอาดได้

ฉันได้ดูรอบนี้ใน SSIS ความชอบของฉันคือการใช้องค์ประกอบสคริปต์ที่มีการแสดงออก regex ในบางรหัส C # ตามด้วยการเปลี่ยนเส้นทาง ถึงกระนั้นฉันก็สงสัยว่ามีวิธีใน SSIS ที่จะทำเช่นนี้โดยไม่ต้องหันไปใช้ C #

ฉันไม่ได้มีโชคมากมายในการค้นหาวิธีการค้นหาว่ามีกี่ระเบียนที่ไม่มีหมายเลขโทรศัพท์ที่เหมาะสม


คุณมีข้อมูลตัวอย่างได้ไหม?
gbn

1
คุณช่วยตรวจสอบคำตอบที่นี่ได้ไหม?
gbn

สิ่งต่าง ๆ เป็นอย่างไร คุณผ่านอุปสรรค์นี้หรือไม่
ErikE

คำตอบ:


7

มันเป็นงานครั้งเดียว เขียนแอปพลิเคชั่นขนาดเล็กหรือเพียงแค่เลือกสคริปต์ใช้ C #, VB.NET, T-SQL ... และวิเคราะห์รูปแบบทั้งหมดด้วยตนเอง บางทีคุณอาจจะพบรูปแบบทั่วไปของผู้ให้บริการที่ป้อนข้อมูลนี้ เพิ่มอัลกอริทึมสำหรับทุกรูปแบบ ใช้รูปแบบของคุณกับข้อมูลจริงในฐานข้อมูล ลบระเบียน "ผิด" ทั้งหมด

โชค.

เพิ่ม:

ในฐานะตัวเลือกคุณสามารถใช้ฐานข้อมูลหมายเลขโทรศัพท์เพื่อตรวจสอบ person2 จำนวนที่ถูกต้องถ้าเป็นไปได้


โดยส่วนตัวฉันจะไม่ลบหมายเลข 'ผิด' ... เนื่องจากอาจเป็นรูปแบบที่คุณไม่ได้พิจารณา (เช่นมีคนนำหน้าด้วย '+') ... ให้เรียกใช้สองสามครั้งในโหมดแก้ไขจุดบกพร่อง มันรายงานสิ่งที่พิจารณาว่าเป็นค่าที่ไม่ดีและมองผ่านมันก่อนที่คุณจะทำการแก้ไขใด ๆ
Joe

@Joe เห็นด้วย: ฉันใช้สองคอลัมน์ "ใหม่" ค่าและ "เก่า" หนึ่งเพื่อสำรองข้อมูล มันเป็นเพียงคำว่า "แข็งแรง" :)
garik

4

SSIS = บริการการรวมเซิร์ฟเวอร์ SQL - ส่วนใหญ่เป็นวิธีการรวมข้อมูลจากหลายแหล่งไปยังปลายทางหลายแห่ง บางอย่างเช่นเอนจินที่ใช้ข้อมูลจาก excel / csv / text .. ไฟล์อื่น ๆ ที่อยู่ในใจ .. และย้ายไปยังฐานข้อมูล หรือวิธีอื่น ๆ

แต่ในการเลือกและจัดการข้อมูลจริงคุณยังคงสามารถ / จำเป็นต้องใช้ T-SQL

จากสิ่งที่ฉันรู้ T-SQL ไม่มีส่วนประกอบ regex ใด ๆ ที่จะช่วยคุณได้ดังนั้นคุณจะต้องใช้แอสเซมบลี. NET เพื่อทำสิ่งนั้น


1

คุณสามารถประมาณค่าได้อย่างรวดเร็วผ่าน WHERE clause ต่อไปนี้เนื่องจากหมายเลขโทรศัพท์ไม่ควรมีตัวอักษรอัลฟา ... เว้นแต่คุณจะอนุญาตให้มีการออกเสียงตัวเลขเช่น 1-800-ANT-FARM

WHERE phonenumber LIKE '%[a-zA-Z]%'

คุณไม่สามารถทำ regex ที่ซับซ้อนได้โดยใช้ LIKEแต่คุณสามารถได้รับการประมาณที่ใกล้เคียง

การทดสอบของฉัน:

WITH cte AS (
    SELECT id, phone
    FROM (
        VALUES
            (1, '1234567890'),
            (2, '4567890'),
            (3, '(123) 456-7890'),
            (4, '123-456-7890'),
            (5, '123.456.7890'),
            (6, 'Testing')
    )
    AS MyTable(id, phone)
)
SELECT *
FROM cte
WHERE phone LIKE '%[a-zA-Z]%'

1

ขึ้นอยู่กับสิ่งที่ยอมรับได้หรือไม่อยู่ในหมายเลขโทรศัพท์

สิ่งนี้จะให้ค่าทั้งหมดที่ไม่ใช่ตัวเลข 100% โดยใช้ NOT ในรูปแบบการค้นหา

WHERE phonenumber LIKE '%[^0-9]%'

แต่ถ้าคุณอนุญาต-หรือ(000)ซับซ้อนกว่านี้: ต้องการข้อมูลตัวอย่างกรุณา


0

ลองสิ่งนี้:

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()สำหรับตัวอักษรแต่ละตัวในตัวอักษร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.