Was ist der beste Weg, um herauszufinden, wie viele Datensätze in SQL Server keine richtige Telefonnummer haben?


11

Ich habe ein Feld, das Menschen historisch nutzen könnten, um einen Wert frei zu liefern. Ich muss die Datensätze identifizieren, die keinen geeigneten Wert haben, damit ich sie bereinigen kann.

Ich habe mich in SSIS danach umgesehen. Meine Neigung ist es, eine Skriptkomponente mit einem regulären Ausdruck in einem C # -Code zu verwenden, gefolgt von einer Umleitung. Trotzdem habe ich mich gefragt, ob es in SSIS eine Möglichkeit gibt, dies zu tun, ohne auf C # zurückzugreifen.

Ich hatte nicht viel Glück, einen Weg zu finden, um herauszufinden, wie viele Datensätze keine geeigneten Telefonnummern haben.


Haben Sie bitte Beispieldaten?
Gbn

1
Können Sie die Antworten hier bitte überprüfen?
gbn

Wie ist es gelaufen? Hast du diese Hürde genommen?
ErikE

Antworten:


7

Es ist eine einmalige Aufgabe. Schreiben Sie eine kleine Anwendung oder wählen Sie einfach ein Skript aus, verwenden Sie C #, VB.NET, T-SQL ... und analysieren Sie alle Muster manuell. Vielleicht finden Sie allgemeine Muster von Operatoren heraus, die diese Daten eingegeben haben. Fügen Sie für jedes Muster einen Algorithmus hinzu. Wenden Sie Ihre Muster auf reale Daten in einer Datenbank an. Entfernen Sie alle "falschen" Datensätze.

Glück.

HINZUGEFÜGT:

Optional können Sie die Datenbank mit Telefonnummern verwenden, um die Gültigkeit von person2number zu überprüfen, wenn dies möglich ist.


Ich persönlich würde 'falsche' Zahlen nicht entfernen ... da es sich möglicherweise um ein Muster handelt, das Sie nicht berücksichtigt haben (z. B. wenn jemandem ein '+' vorangestellt wird) ... führen Sie es einige Male in einem Debugging-Modus aus, in dem Es meldet, was es für einen schlechten Wert hält, und überprüft es, bevor Sie Änderungen vornehmen.
Joe

@ Joe stimmt zu: Ich habe zwei Spalten "neuen" Wert und "alten" verwendet, um Daten zu sichern. Es war nur "starkes" Wort :)
Garik

4

SSIS = SQL Server Integration Service - meistens eine Möglichkeit, Daten aus vielen Quellen in viele Ziele zu integrieren. So etwas wie eine Engine, um Daten aus Excel / CSV / Text zu entnehmen. Welche andere Datei fällt mir ein? Und sie in eine Datenbank zu verschieben. Oder umgekehrt.

Um Daten tatsächlich auszuwählen und zu bearbeiten, müssen / müssen Sie dennoch T-SQL verwenden.

Soweit ich weiß, verfügt T-SQL über keine Regex-Komponente, die Ihnen helfen könnte. Daher müssten Sie dazu eine .NET-Assembly verwenden.


1

Sie können eine schnelle Schätzung über die folgende WHERE-Klausel erhalten, da Telefonnummern keine alphanumerischen Zeichen enthalten sollten ... es sei denn, Sie erlauben phonetische Zahlen, z. 1-800-ANT-FARM.

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

Mit LIKE können Sie keine komplexen regulären Ausdrücke erstellen , aber Sie können eine genaue Annäherung erhalten.

Mein 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

Es hängt davon ab, was in einer Telefonnummer akzeptabel ist oder nicht

Dies gibt Ihnen alle Werte, die nicht 100% numerisch sind, indem Sie NOT im Suchmuster verwenden

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

Aber wenn Sie es erlauben -oder (000)dann ist es komplexer: Benötigen Sie bitte Beispieldaten


0

Versuchen Sie so etwas:

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

Wenn Sie Muster finden, die gültig sind, aber nicht von der Abfrage abgedeckt werden, fügen Sie sie den angezeigten Teilen und Teilen hinzu. Wenn Sie etwas finden, das in beiden Teilen zusammen sein muss, modellieren Sie es nach dem Erweiterungs-CTE (der entweder fehlt oder eine Kombination aus Ext1 und Ext2 ist). Wenn Sie internationale Nummern unterstützen müssen und diese unterschiedliche Muster haben (nicht mit den US 3-3-4 übereinstimmen), benötigen Sie eine Analyse und korrekte Korrelation, damit die richtigen Ländercodes mit den richtigen Mustern übereinstimmen. Ich weiß zum Beispiel, dass dies in bestimmten Teilen Brasiliens eine gültige Nummer ist: +55 85 1234-5678 (Landesvorwahl 55, Vorwahl zweistellig, dann 4-4 Muster).

Eine andere Technik, mit der Sie Ihre Daten analysieren können, ist folgende:

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;

Dies kann Ihnen helfen, zu verstehen, wie Ihre Daten aussehen, indem Sie die tatsächlichen Telefonnummernunterschiede zwischen den einzelnen Zeilen ignorieren und nur auf die Anordnung und Anzahl der Ziffern achten. Wenn viele Alpha-Zeichen vorhanden sind, versuchen Sie, gültige Muster (z. B. "ext") durch einen Wert zu ersetzen, der nicht in der Liste enthalten ist, damit Sie den Rest der falschen Eingabe in etwas reduzieren können, das mit einem ähnlichen analysiert werden kann Replace()für jeden Buchstaben im Alphabet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.