¿Cuál es la mejor manera de averiguar cuántos registros no tienen un número de teléfono adecuado en SQL Server?

11

Tengo un campo que la gente históricamente podría usar para suministrar libremente un valor. Necesito identificar los registros que no tienen un valor apropiado para poder limpiarlos.

He estado buscando en SSIS para esto. Mi inclinación es usar un componente de secuencia de comandos con una expresión regular en algún código C #, seguido de una redirección. Aún así, me preguntaba si había una forma en SSIS para hacer esto sin recurrir a C #.

No he tenido mucha suerte al encontrar una manera de averiguar cuántos registros no tienen los números de teléfono apropiados.

rsteckly
fuente
¿Tiene datos de muestra por favor?
gbn
1
¿Puedes revisar las respuestas aquí por favor?
gbn
¿Cómo fueron las cosas? ¿Pasaste este obstáculo?
ErikE

Respuestas:

7

Es una tarea de una sola vez. Escriba una pequeña aplicación o simplemente seleccione un script, use C #, VB.NET, T-SQL ... y analice todos los patrones manualmente. Quizás descubra patrones comunes de los operadores que incorporaron estos datos. Agregue un algoritmo para cada patrón. Aplica tus patrones a datos reales en una base de datos. Eliminar todos los registros "incorrectos".

Suerte.

ADICIONAL:

Como opción, puede utilizar la base de datos de números de teléfono para verificar la validez de la persona número2 si es posible.

Garik
fuente
Personalmente, no eliminaría los números 'incorrectos' ... ya que podría ser un patrón que no había considerado (por ejemplo, alguien que lo prefija con un '+') ... ejecútelo varias veces en un modo de depuración donde informa lo que considera un mal valor y lo revisa antes de que haga modificaciones.
Joe
@Joe está de acuerdo: utilicé dos columnas de valor "nuevo" y uno "antiguo" para hacer una copia de seguridad de los datos. Era solo una palabra "fuerte" :)
garik
4

SSIS = Servicio de integración de SQL Server, principalmente una forma de integrar datos de muchas fuentes a muchos destinos. Algo así como un motor para tomar datos de excel / csv / text ... qué otro archivo viene a la mente ... y moverlo a una base de datos. O al revés.

Pero para seleccionar y manipular los datos, aún podría / se le requeriría usar T-SQL.

Por lo que sé, T-SQL no tiene ningún componente regex para ayudarte, por lo que deberías usar un ensamblado .NET para hacerlo.

Mariana
fuente
1

Puede obtener una estimación rápida a través de la siguiente cláusula WHERE ya que los números de teléfono no deben tener caracteres alfabéticos ... a menos que permita números fonéticos, ej. 1-800-ANT-FARM.

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

No puede hacer expresiones regulares complejas usando LIKE , pero podría obtener una aproximación cercana.

Mi prueba:

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
fuente
1

Depende de lo que sea aceptable o no en un número de teléfono

Esto le proporciona todos los valores que no son 100% numéricos al usar NOT en el patrón de búsqueda

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

Pero si lo permite -o (000)es más complejo: necesita datos de muestra, por favor

gbn
fuente
0

Intenta algo como esto:

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 encuentra patrones que son válidos pero no están cubiertos por la consulta, agréguelos a las partes y piezas que se muestran. Si encuentra algo que necesita estar junto en las dos partes, entonces modeléelo después de la Extensión CTE (que falta o una combinación de Ext1 y Ext2). Si necesita admitir números internacionales y tienen patrones diferentes (que no coinciden con los Estados Unidos 3-3-4), necesitará un análisis y una correlación adecuada para que los códigos de país correctos coincidan con los patrones correctos. Por ejemplo, sé que en ciertas partes de Brasil, este es un número válido: +55 85 1234-5678 (código de país 55, código de área de dos dígitos, luego patrón 4-4).

Otra técnica para ayudarlo a analizar sus datos es esta:

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;

Esto puede ayudarlo a comprender cómo son sus datos al ignorar las diferencias de números de teléfono reales entre cada fila y prestar atención solo a la disposición y el recuento de dígitos. Si hay muchos caracteres alfabéticos, intente comenzar a reemplazar patrones válidos (como "ext") con un valor que no se encuentre en la lista, para que pueda colapsar el resto de la entrada espuria en algo que pueda analizarse con un valor similar. Replace()para cada letra del alfabeto

ErikE
fuente