Qual é a melhor maneira de descobrir quantos registros não têm um número de telefone adequado no SQL Server?

11

Eu tenho um campo que as pessoas historicamente poderiam usar para fornecer livremente um valor. Preciso identificar os registros que não possuem um valor apropriado para que eu possa limpá-los.

Eu estive procurando no SSIS por isso. Minha inclinação é usar um componente de script com uma expressão regex em algum código C #, seguido por um redirecionamento. Ainda assim, eu queria saber se havia uma maneira no SSIS de fazer isso sem recorrer ao C #.

Não tive muita sorte em encontrar uma maneira de descobrir quantos registros não têm números de telefone apropriados.

rsteckly
fonte
Você tem dados de amostra, por favor?
gbn 18/02
1
Você pode revisar as respostas aqui, por favor?
gbn
Como foram as coisas? Você passou por esse obstáculo?
ErikE

Respostas:

7

É uma tarefa única. Escreva um aplicativo pequeno ou apenas selecione um script, use C #, VB.NET, T-SQL ... e analise todos os padrões manualmente. Talvez você descubra padrões comuns pelos operadores que inseriram esses dados. Adicione um algoritmo para cada padrão. Aplique seus padrões a dados reais em um banco de dados. Remova todos os registros "errados".

Sorte.

ADICIONADO:

Como opção, você pode usar o banco de dados de números de telefone para verificar a validade de person2number, se possível.

garik
fonte
Eu pessoalmente não removeria números 'errados' ... pois pode ser um padrão que você não considerou (por exemplo, alguém prefixando-o com um '+') ... execute-o algumas vezes em um modo de depuração em que ele relata o que considera um valor ruim e analisa-o antes que você faça as modificações.
18711 Joe
@ Joe concorda: usei duas colunas "novo" e "antigo" para fazer backup de dados. Foi só palavra "forte" :)
Garik
4

SSIS = Serviço de Integração do SQL Server - principalmente uma maneira de integrar dados de várias fontes para muitos destinos. Algo como um mecanismo para pegar dados do excel / csv / text .. que outro arquivo vem à mente .. e movê-los para um banco de dados. Ou o contrário.

Mas, para realmente selecionar e manipular dados, você ainda poderá / precisará usar o T-SQL.

Pelo que sei, o T-SQL não possui nenhum componente de regex para ajudá-lo; portanto, você precisará usar um assembly .NET para fazer isso.

Marian
fonte
1

Você pode obter uma estimativa rápida através da seguinte cláusula WHERE, já que os números de telefone não devem ter caracteres alfabéticos ... a menos que você permita números fonéticos, por exemplo, 1-800-ANT-FARM.

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

Você não pode executar expressões regulares complexas usando LIKE , mas pode obter uma aproximação aproximada.

Meu teste:

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 - lotes de ajuda
fonte
1

Depende do que é aceitável ou não em um número de telefone

Isso fornece todos os valores que não são 100% numéricos usando NOT no padrão de pesquisa

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

Mas se você permitir -ou (000)for mais complexo: precisa de dados de amostra, por favor

gbn
fonte
0

Tente algo como isto:

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 você encontrar padrões válidos, mas não cobertos pela consulta, adicione-os às partes e peças mostradas. Se você encontrar algo que precisa estar junto nas duas partes, modele-o após o Extension CTE (que está ausente ou uma combinação de Ext1 e Ext2). Se você precisar oferecer suporte a números internacionais, e eles tiverem padrões diferentes (que não correspondam aos EUA 3-3-4), será necessária alguma análise e correlação adequada para fazer com que os códigos de país certos correspondam aos padrões certos. Por exemplo, eu sei que em certas partes do Brasil, este é um número válido: +55 85 1234-5678 (código do país 55, código de área dois dígitos e padrão 4-4).

Outra técnica para ajudá-lo a analisar seus dados é:

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;

Isso pode ajudá-lo a entender como são os seus dados, ignorando as diferenças reais de número de telefone entre cada linha e prestando atenção apenas à organização e contagem de dígitos. Se houver muitos caracteres alfa, tente começar a substituir padrões válidos (como "ext") por um valor não encontrado na lista, para recolher o restante da entrada espúria em algo que possa ser analisado com um valor semelhante. Replace()para cada letra do alfabeto.

ErikE
fonte