Cách tốt nhất để tìm hiểu có bao nhiêu hồ sơ không có số điện thoại thích hợp trong SQL Server là gì?


11

Tôi có một lĩnh vực mà mọi người trong lịch sử có thể sử dụng để tự do cung cấp một giá trị. Tôi cần xác định các hồ sơ không có giá trị phù hợp để tôi có thể xóa chúng.

Tôi đã tìm kiếm xung quanh trong SSIS cho điều này. Xu hướng của tôi là sử dụng một thành phần tập lệnh với biểu thức regex trong một số mã C #, theo sau là một chuyển hướng. Tuy nhiên, tôi đã tự hỏi liệu có cách nào trong SSIS để làm điều này mà không cần dùng đến C #.

Tôi đã không gặp nhiều may mắn khi tìm cách tìm ra có bao nhiêu hồ sơ không có số điện thoại phù hợp.


Bạn có dữ liệu mẫu xin vui lòng?
gbn

1
Bạn có thể xem lại câu trả lời ở đây không?
gbn

Mọi chuyện thế nào rồi? Bạn đã vượt qua rào cản này?
ErikE

Câu trả lời:


7

Đó là một nhiệm vụ một lần. Viết một ứng dụng nhỏ hoặc chỉ chọn tập lệnh, sử dụng C #, VB.NET, T-SQL ... và phân tích tất cả các mẫu theo cách thủ công. Có thể bạn sẽ tìm ra các mẫu phổ biến của các nhà khai thác đã nhập dữ liệu này. Thêm một thuật toán cho mọi mẫu. Áp dụng các mẫu của bạn cho dữ liệu thực trong cơ sở dữ liệu. Xóa tất cả các hồ sơ "sai".

May mắn

THÊM:

Tùy chọn, bạn có thể sử dụng cơ sở dữ liệu về số điện thoại để kiểm tra tính hợp lệ của person2number nếu có thể.


Cá nhân tôi sẽ không xóa các số 'sai' ... vì đó có thể là một mẫu mà bạn đã xem xét (ví dụ: ai đó có tiền tố với dấu '+') ... chạy một vài lần trong chế độ gỡ lỗi trong đó nó báo cáo những gì nó coi là một giá trị xấu và xem qua nó trước khi bạn thực hiện bất kỳ sửa đổi nào.
Joe

@Joe đồng ý: Tôi đã sử dụng hai cột giá trị "mới" và "cũ" để sao lưu dữ liệu. Đó chỉ là từ "mạnh" :)
garik

4

SSIS = Dịch vụ tích hợp máy chủ SQL - chủ yếu là cách tích hợp dữ liệu từ nhiều nguồn đến nhiều đích. Một cái gì đó giống như một công cụ để lấy dữ liệu từ excel / csv / text .. những gì tệp khác xuất hiện trong tâm trí .. và di chuyển nó đến cơ sở dữ liệu. Hoặc cách khác xung quanh.

Nhưng để thực sự chọn và thao tác dữ liệu, bạn vẫn có thể / được yêu cầu sử dụng T-SQL.

Từ những gì tôi biết, T-SQL không có bất kỳ thành phần regex nào để giúp bạn, vì vậy bạn sẽ được yêu cầu sử dụng một cụm .NET để làm điều đó.


1

Bạn có thể có được ước tính nhanh thông qua mệnh đề WHERE sau vì số điện thoại không nên có ký tự alpha ... trừ khi bạn cho phép số phiên âm, ví dụ: 1-800-ANT-TRANG TRẠI.

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

Bạn không thể thực hiện regex phức tạp bằng cách sử dụng THÍCH , nhưng bạn có thể có được xấp xỉ gần đúng.

Bài kiểm tra của tôi:

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

Nó phụ thuộc vào những gì được chấp nhận hay không trong một số điện thoại

Điều này cung cấp cho bạn tất cả các giá trị không phải là số 100% bằng cách sử dụng KHÔNG trong mẫu tìm kiếm

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

Nhưng nếu bạn cho phép -hoặc (000)sau đó thì phức tạp hơn: cần dữ liệu mẫu


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.