Qual è il modo migliore per scoprire quanti record non hanno un numero di telefono corretto in SQL Server?


11

Ho un campo che le persone storicamente potrebbero usare per fornire liberamente un valore. Devo identificare i record che non hanno un valore appropriato per poterli pulire.

Per questo mi sono guardato intorno in SSIS. La mia inclinazione è usare un componente di script con un'espressione regex in un codice C #, seguito da un reindirizzamento. Tuttavia, mi chiedevo se in SSIS c'era un modo per farlo senza ricorrere a C #.

Non ho avuto molta fortuna a trovare un modo per scoprire quanti record non hanno numeri di telefono appropriati.


Hai dei dati di esempio per favore?
gbn

1
Puoi rivedere le risposte qui per favore?
gbn

Come sono andate le cose? Hai superato questo ostacolo?
ErikE,

Risposte:


7

È un compito una tantum. Scrivi una piccola applicazione o seleziona lo script, usa C #, VB.NET, T-SQL ... e analizza tutti i pattern manualmente. Forse scoprirai schemi comuni da parte degli operatori che hanno inserito questi dati. Aggiungi un algoritmo per ogni modello. Applica i tuoi schemi a dati reali in un database. Rimuovi tutti i record "errati".

Fortuna.

AGGIUNTO:

Come opzione, è possibile utilizzare il database dei numeri di telefono per verificare la validità di person2number, se possibile.


Personalmente non rimuoverei numeri "sbagliati" ... in quanto potrebbe essere un modello che non avevi considerato (ad esempio, qualcuno che lo precede con un "+") ... eseguirlo alcune volte in una modalità di debug in cui segnala ciò che considera un valore negativo e lo esamina prima di apportare modifiche.
Joe,

@Joe d'accordo: ho usato due colonne "nuovo" valore e "vecchio" uno per il backup dei dati. Era solo una parola "forte" :)
martedì

4

SSIS = SQL Server Integration Service - principalmente un modo per integrare i dati da molte origini a molte destinazioni. Qualcosa come un motore per prendere i dati da Excel / CSV / testo ... quale altro file viene in mente ... e spostarlo in un database. O viceversa.

Ma per selezionare e manipolare effettivamente i dati sarebbe comunque possibile / essere richiesto di utilizzare T-SQL.

Da quello che so T-SQL non ha alcun componente regex per aiutarti, quindi ti sarebbe richiesto di usare un assembly .NET per farlo.


1

È possibile ottenere una stima rapida tramite la seguente clausola WHERE poiché i numeri di telefono non devono avere caratteri alfa ... a meno che non si consentano numeri fonetici, ad es. 1-800-ANT-FARM.

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

Non puoi eseguire regex complessi usando LIKE , ma potresti ottenere un'approssimazione stretta.

Il mio 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

Dipende da cosa è accettabile o meno in un numero di telefono

Questo ti dà tutti i valori che non sono numerici al 100% usando NOT nel modello di ricerca

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

Ma se lo consenti -o (000)è più complesso: hai bisogno di dati di esempio per favore


0

Prova qualcosa del genere:

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

Se trovate motivi validi ma non coperti dalla query, aggiungeteli alle parti e ai pezzi mostrati. Se trovi qualcosa che deve essere unito nelle due parti, modellalo dopo l'Extension CTE (che manca o una combinazione di Ext1 ed Ext2). Se hai bisogno di supportare numeri internazionali, e hanno schemi diversi (non corrispondenti agli Stati Uniti 3-3-4), allora avrai bisogno di alcune analisi e correlazioni adeguate per far corrispondere i giusti codici di paesi con gli schemi giusti. Ad esempio, so che in alcune parti del Brasile, questo è un numero valido: +55 85 1234-5678 (prefisso 55, prefisso due cifre, quindi schema 4-4).

Un'altra tecnica per aiutarti ad analizzare i tuoi dati è questa:

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;

Questo può aiutarti a capire come sono i tuoi dati ignorando le effettive differenze del numero di telefono tra ogni riga e prestando attenzione solo alla disposizione e al conteggio delle cifre. Se ci sono molti caratteri alfa, prova a iniziare a sostituire modelli validi (come "ext") con un valore non trovato nell'elenco, quindi puoi comprimere il resto dell'input spurio in qualcosa che può essere analizzato con un simile Replace()per ogni lettera dell'alfabeto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.