sql >> Base de Datos >  >> RDS >> Sqlserver

Coincidencia aproximada de SQL

Una solución específica de dominio bastante rápida puede ser calcular una similitud de cadena utilizando SOUNDEX y una distancia numérica entre 2 cadenas. Esto solo será realmente útil cuando tenga muchos códigos de productos.

Usando un UDF simple como el siguiente, puede extraer los caracteres numéricos de una cadena para que luego pueda obtener 2200 de 'CLC 2200npk' y 1100 de 'CLC 1100' para que ahora pueda determinar la cercanía en función de la salida SOUNDEX de cada entrada así como la cercanía del componente numérico de cada entrada.

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

En lo que respecta a los algoritmos de propósito general, hay un par que pueden ayudarlo con diversos grados de éxito según el tamaño del conjunto de datos y los requisitos de rendimiento. (ambos enlaces tienen implementaciones TSQL disponibles)

  • Double Metaphone:este algoritmo le dará una mejor combinación que Soundex a costa de la velocidad, aunque es realmente bueno para la corrección ortográfica.
  • Distancia de Levenshtein:esto calculará cuántas pulsaciones de teclas se necesitarían para convertir una cadena en otra, por ejemplo, para pasar de 'CLC 2200npk' a 'CLC 2200' es 3, mientras que de 'CLC 2200npk' a 'CLC 1100' es 5.

Aquí hay un artículo interesante que aplica ambos algoritmos juntos que puede darte algunas ideas.

Bueno, espero que algo de eso ayude un poco.

EDITAR:aquí hay una implementación parcial de distancia de Levenshtein mucho más rápida (lea la publicación, no devolverá exactamente los mismos resultados que la normal). En mi tabla de prueba de 125000 filas, se ejecuta en 6 segundos en comparación con los 60 segundos de la primera a la que me vinculé.