Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Corrispondenza fuzzy SQL

Una soluzione specifica del dominio piuttosto rapida potrebbe essere quella di calcolare una somiglianza di stringa utilizzando SOUNDEX e una distanza numerica tra 2 stringhe. Questo ti aiuterà davvero solo quando hai molti codici prodotto.

Usando un semplice UDF come di seguito puoi estrarre i caratteri numerici da una stringa in modo da poter quindi ottenere 2200 da "CLC 2200npk" e 1100 da "CLC 1100" in modo da poter determinare la vicinanza in base all'output SOUNDEX di ciascun input così come la vicinanza della componente numerica di ogni input.

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

Per quanto riguarda gli algoritmi generici, ce ne sono un paio che potrebbero aiutarti con vari gradi di successo a seconda delle dimensioni del set di dati e dei requisiti di prestazioni. (entrambi i link hanno implementazioni TSQL disponibili)

  • Doppio Metafono - Questo algoritmo ti darà una corrispondenza migliore di soundex a costo della velocità, ma è davvero ottimo per la correzione dell'ortografia.
  • Distanza di Levenshtein - Questo calcolerà quante pressioni di tasti sarebbero necessarie per trasformare una stringa in un'altra, ad esempio per passare da "CLC 2200npk" a "CLC 2200" è 3, mentre da "CLC 2200npk" a "CLC 1100" è 5.

Ecco un articolo interessante che applica entrambi gli algoritmi insieme e potrebbe darti alcune idee.

Spero che alcuni di questi aiutino un po'.

EDIT:ecco un'implementazione parziale di Levenshtein Distance molto più veloce (leggi il post non restituirà esattamente gli stessi risultati di quello normale). Sulla mia tabella di test di 125000 righe viene eseguita in 6 secondi rispetto ai 60 secondi della prima a cui mi sono collegato.