Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Correspondência difusa do SQL


Uma solução específica de domínio bastante rápida pode ser calcular uma similaridade de string usando SOUNDEX e uma distância numérica entre 2 strings. Isso só ajudará quando você tiver muitos códigos de produto.

Usando um UDF simples como abaixo, você pode extrair os caracteres numéricos de uma string para que você possa obter 2200 de 'CLC 2200npk' e 1100 de 'CLC 1100' para que agora você possa determinar a proximidade com base na saída SOUNDEX de cada entrada bem como a proximidade do componente numérico de cada entrada.
Função
CREATE Function [dbo].[ExtractNumeric](@input VARCHAR(1000))
RETURNS INT
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @input) > 0
    BEGIN
        SET @input = STUFF(@input, PATINDEX('%[^0-9]%', @input), 1, '')
    END
    IF @input = '' OR @input IS NULL
        SET @input = '0'
    RETURN CAST(@input AS INT)
END
GO

No que diz respeito aos algoritmos de uso geral, existem alguns que podem ajudá-lo com vários graus de sucesso, dependendo do tamanho do conjunto de dados e dos requisitos de desempenho. (ambos os links têm implementações TSQL disponíveis)
  • Double Metaphone - Este algoritmo lhe dará uma combinação melhor do que soundex ao custo da velocidade, mas é muito bom para correção ortográfica.
  • Levenshtein Distance - Isso calculará quantos pressionamentos de tecla seriam necessários para transformar uma string em outra, por exemplo, para ir de 'CLC 2200npk' para 'CLC 2200' é 3, enquanto de 'CLC 2200npk' para 'CLC 1100' é 5.

Aqui está um artigo interessante que aplica os dois algoritmos juntos, o que pode lhe dar algumas idéias.

Bem, espero que isso ajude um pouco.

EDIT:Aqui está uma implementação de Distância Levenshtein parcial muito mais rápida (leia o post que não retornará exatamente os mesmos resultados que o normal). Na minha tabela de teste de 125.000 linhas, ele é executado em 6 segundos em comparação com 60 segundos para o primeiro ao qual vinculei.