Quelle est la meilleure façon de savoir combien d'enregistrements n'ont pas de numéro de téléphone correct dans SQL Server?

11

J'ai un domaine que les gens pouvaient historiquement utiliser pour fournir librement une valeur. J'ai besoin d'identifier les enregistrements qui n'ont pas de valeur appropriée pour pouvoir les nettoyer.

J'ai cherché autour de SSIS pour cela. Mon inclination est d'utiliser un composant de script avec une expression regex dans du code C #, suivi d'une redirection. Pourtant, je me demandais s'il y avait un moyen dans SSIS de le faire sans recourir à C #.

Je n'ai pas eu beaucoup de chance pour trouver un moyen de savoir combien d'enregistrements n'ont pas de numéros de téléphone appropriés.

rigoureusement
la source
Avez-vous des exemples de données s'il vous plaît?
gbn
1
Pouvez-vous revoir les réponses ici s'il vous plaît?
gbn
Comment ça s'est passé? Avez-vous franchi cet obstacle?
ErikE

Réponses:

7

C'est une tâche ponctuelle. Écrivez une petite application ou sélectionnez simplement un script, utilisez C #, VB.NET, T-SQL ... et analysez tous les modèles manuellement. Vous découvrirez peut-être des modèles courants par les opérateurs qui ont entré ces données. Ajoutez un algorithme pour chaque modèle. Appliquez vos modèles à des données réelles dans une base de données. Supprimez tous les enregistrements "incorrects".

La chance.

AJOUTÉE:

En option, vous pouvez utiliser la base de données de numéros de téléphone pour vérifier la validité du numéro de personne si c'est possible.

garik
la source
Personnellement, je ne supprimerais pas les «mauvais» nombres ... car il pourrait s'agir d'un modèle que vous n'aviez pas envisagé (par exemple, quelqu'un le préfixant avec un «+») ... exécutez-le plusieurs fois dans un mode de débogage où il signale ce qu'il considère comme une mauvaise valeur, et examinez-le avant de lui apporter des modifications.
Joe
@Joe est d'accord: j'ai utilisé deux colonnes "nouvelle" valeur et "ancienne" une pour sauvegarder les données. C'était juste un mot "fort" :)
garik
4

SSIS = SQL Server Integration Service - principalement un moyen d'intégrer des données provenant de nombreuses sources vers de nombreuses destinations. Quelque chose comme un moteur pour extraire des données d'Excel / CSV / Text. Quel autre fichier vient à l'esprit ... et le déplacer vers une base de données. Ou l'inverse.

Mais pour réellement sélectionner et manipuler des données, vous seriez toujours en mesure d'utiliser le T-SQL.

D'après ce que je sais, T-SQL n'a pas de composant regex pour vous aider, vous devrez donc utiliser un assembly .NET pour ce faire.

Marian
la source
1

Vous pouvez obtenir une estimation rapide via la clause WHERE suivante, car les numéros de téléphone ne doivent pas avoir de caractères alpha ... sauf si vous autorisez les numéros phonétiques, par ex. 1-800-ANT-FARM.

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

Vous ne pouvez pas faire de regex complexe en utilisant LIKE , mais vous pouvez obtenir une approximation proche.

Mon 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]%'
Eric Humphrey - lotsahelp
la source
1

Cela dépend de ce qui est acceptable ou non dans un numéro de téléphone

Cela vous donne toutes les valeurs qui ne sont pas 100% numériques en utilisant NOT dans le modèle de recherche

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

Mais si vous autorisez -ou (000)alors c'est plus complexe: besoin d'échantillons de données s'il vous plaît

gbn
la source
0

Essayez quelque chose comme ceci:

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

Si vous trouvez des modèles valides mais non couverts par la requête, ajoutez-les aux pièces et pièces affichées. Si vous trouvez quelque chose qui doit être ensemble dans les deux parties, modélisez-le après l'Extension CTE (qui est manquant ou une combinaison de Ext1 et Ext2). Si vous devez prendre en charge les numéros internationaux et qu'ils ont des modèles différents (ne correspondant pas aux États-Unis 3-3-4), vous aurez besoin d'une analyse et d'une corrélation appropriée pour que les bons codes de pays correspondent aux bons modèles. Par exemple, je sais que dans certaines régions du Brésil, il s'agit d'un numéro valide: +55 85 1234-5678 (indicatif de pays 55, indicatif régional à deux chiffres, puis motif 4-4).

Une autre technique pour vous aider à analyser vos données est la suivante:

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;

Cela peut vous aider à comprendre à quoi ressemblent vos données en ignorant les différences réelles de numéro de téléphone entre chaque ligne et en faisant attention uniquement à la disposition et au nombre de chiffres. S'il y a beaucoup de caractères alpha, essayez de commencer à remplacer les modèles valides (tels que "ext") par une valeur introuvable dans la liste, afin de pouvoir réduire le reste de l'entrée parasite en quelque chose qui peut être analysé avec un similaire Replace()pour chaque lettre de l'alphabet.

ErikE
la source