Poměrně rychlým řešením specifickým pro doménu může být výpočet podobnosti řetězců pomocí SOUNDEX a číselné vzdálenosti mezi 2 řetězci. To opravdu pomůže pouze tehdy, když budete mít hodně produktových kódů.
Pomocí jednoduchého UDF, jak je uvedeno níže, můžete extrahovat číselné znaky z řetězce, takže pak můžete získat 2200 z „CLC 2200npk“ a 1100 z „CLC 1100“, takže nyní můžete určit blízkost na základě výstupu SOUNDEX každého vstupu. stejně jako blízkost číselné složky každého vstupu.
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
Pokud jde o obecné algoritmy, existuje několik, které vám mohou pomoci s různým stupněm úspěchu v závislosti na velikosti datové sady a požadavcích na výkon. (oba odkazy mají k dispozici implementace TSQL)
- Double Metaphone – Toto algo vám poskytne lepší shodu než soundex za cenu rychlosti, ale je opravdu dobré pro opravu pravopisu.
- Levenshtein Distance – Tato možnost vypočítá, kolik stisknutí kláves by bylo zapotřebí k přeměně jednoho řetězce na jiný, například k přechodu z „CLC 2200npk“ na „CLC 2200“ je 3, zatímco z „CLC 2200npk“ na „CLC 1100“ je 5.
Zde je zajímavý článek, který aplikuje obě alga dohromady, což vám může poskytnout několik nápadů.
No, doufám, že něco z toho trochu pomůže.
EDIT:Zde je mnohem rychlejší částečná implementace Levenshtein Distance (přečtěte si příspěvek, nevrátí přesně stejné výsledky jako normální). Na mé testovací tabulce s 125 000 řádky běží za 6 sekund ve srovnání s 60 sekundami u prvního, na který jsem odkazoval.