Jaki jest najlepszy sposób, aby dowiedzieć się, ile rekordów nie ma właściwego numeru telefonu w SQL Server?


11

Mam dziedzinę, z której ludzie historycznie mogliby korzystać, aby swobodnie dostarczać wartość. Muszę zidentyfikować rekordy, które nie mają odpowiedniej wartości, aby je wyczyścić.

Rozglądałem się w tym celu w SSIS. Moją skłonnością jest użycie komponentu skryptu z wyrażeniem regularnym w jakimś kodzie C #, a następnie przekierowania. Mimo to zastanawiałem się, czy jest jakiś sposób, aby SSIS to zrobić bez uciekania się do C #.

Nie miałem szczęścia znaleźć sposobu, aby dowiedzieć się, ile rekordów nie ma odpowiednich numerów telefonów.


Czy masz przykładowe dane?
gbn

1
Czy możesz przejrzeć odpowiedzi tutaj?
gbn

Jak poszło? Przeszedłeś tę przeszkodę?
ErikE,

Odpowiedzi:


7

To jednorazowe zadanie. Napisz małą aplikację lub po prostu wybierz skrypt, użyj C #, VB.NET, T-SQL ... i ręcznie przeanalizuj wszystkie wzorce. Być może poznasz wspólne wzorce operatorów, którzy wprowadzili te dane. Dodaj algorytm dla każdego wzorca. Zastosuj swoje wzorce do rzeczywistych danych w bazie danych. Usuń wszystkie „złe” rekordy.

Szczęście.

DODANY:

Opcjonalnie możesz użyć bazy numerów telefonów, aby sprawdzić ważność person2number, jeśli to możliwe.


Osobiście nie usunęłbym „złych” liczb ... ponieważ może to być wzorzec, którego nie wziąłeś pod uwagę (np. Ktoś poprzedzający go „+”)… uruchom go kilka razy w trybie debugowania, w którym zgłasza, co uważa za złą wartość, i przegląda go, zanim będzie można wprowadzić jakiekolwiek modyfikacje.
Joe

@Joe zgadzają się: do tworzenia kopii zapasowych danych użyłem dwóch kolumn „nowa” wartość i „stara”. To było po prostu „mocne” słowo :)
garik

4

SSIS = SQL Server Integration Service - głównie sposób integracji danych z wielu źródeł do wielu miejsc docelowych. Coś w rodzaju silnika do pobierania danych z programu excel / csv / text ... co innego przychodzi na myśl ... i przenoszenia go do bazy danych. Albo na odwrót.

Ale aby faktycznie wybierać i manipulować danymi, nadal będziesz / mógł być zobowiązany do używania T-SQL.

Z tego, co wiem, T-SQL nie ma żadnego składnika wyrażenia regularnego, który by ci pomógł, więc będziesz musiał użyć do tego zestawu .NET.


1

Możesz szybko oszacować za pomocą następującej klauzuli WHERE, ponieważ numery telefonów nie powinny zawierać znaków alfabetu ... chyba że zezwolisz na liczby fonetyczne, np. 1-800-ANT-FARM.

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

Nie można wykonać złożonego wyrażenia regularnego przy użyciu LIKE , ale można uzyskać dokładne przybliżenie.

Mój test:

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

To zależy od tego, co jest dopuszczalne, czy nie w numerze telefonu

Daje to wszystkie wartości, które nie są w 100% numeryczne przy użyciu NOT we wzorcu wyszukiwania

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

Ale jeśli na to pozwolisz -lub (000)będzie to bardziej skomplikowane: potrzebujesz przykładowych danych


0

Wypróbuj coś takiego:

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
);

Jeśli znajdziesz wzory, które są prawidłowe, ale nie są objęte zapytaniem, dodaj je do pokazanych części i elementów. Jeśli znajdziesz coś, co musi być razem w dwóch częściach, zamodeluj to po rozszerzeniu CTE (którego brakuje albo kombinacji Ext1 i Ext2). Jeśli potrzebujesz obsługi numerów międzynarodowych, a mają one różne wzorce (niezgodne z amerykańskimi 3-3-4), potrzebujesz analizy i odpowiedniego skorelowania, aby dopasować odpowiednie kody krajów do odpowiednich wzorców. Na przykład wiem, że w niektórych częściach Brazylii jest to prawidłowy numer: +55 85 1234-5678 (kod kraju 55, numer kierunkowy dwie cyfry, a następnie wzór 4-4).

Kolejną techniką, która pomaga analizować dane, jest:

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;

Pomoże Ci to zrozumieć, jakie są twoje dane, ignorując rzeczywiste różnice numerów telefonów między poszczególnymi wierszami i zwracając uwagę tylko na układ i liczbę cyfr. Jeśli jest dużo znaków alfanumerycznych, spróbuj rozpocząć zastępowanie prawidłowych wzorców (takich jak „ext”) wartością, której nie ma na liście, abyś mógł zawinąć resztę fałszywych danych wejściowych w coś, co można przeanalizować za pomocą podobnego Replace()dla każdej litery w alfabecie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.