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

SQL Fuzzy Matching

En ret hurtig domænespecifik løsning kan være at beregne en strenglighed ved hjælp af SOUNDEX og en numerisk afstand mellem 2 strenge. Dette vil kun virkelig hjælpe, når du har mange produktkoder.

Ved at bruge en simpel UDF som nedenfor kan du udtrække de numeriske tegn fra en streng, så du derefter kan få 2200 ud af 'CLC 2200npk' og 1100 ud af 'CLC 1100', så du nu kan bestemme nærhed baseret på SOUNDEX-outputtet af hvert input samt nærhed af den numeriske komponent af hvert 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

Hvad angår algoritmer til generelle formål, er der et par, som kan hjælpe dig med varierende grader af succes afhængigt af datasættets størrelse og ydeevnekrav. (begge links har TSQL-implementeringer tilgængelige)

  • Dobbelt metafon - Denne algo vil give dig et bedre match end soundex på bekostning af hastighed, men den er virkelig god til stavekorrektion.
  • Levenshtein Distance - Dette vil beregne, hvor mange tastetryk det ville tage at forvandle en streng til en anden for eksempel at komme fra 'CLC 2200npk' til 'CLC 2200' er 3, mens fra 'CLC 2200npk' til 'CLC 1100' er 5.

Her er en interessant artikel, der anvender begge algoer sammen, hvilket kan give dig et par ideer.

Nå, forhåbentlig hjælper noget af det lidt.

EDIT:Her er en meget hurtigere delvis Levenshtein Distance implementering (læs indlægget, det vil ikke returnere nøjagtigt samme resultater som det normale). På min testtabel med 125.000 rækker kører den på 6 sekunder sammenlignet med 60 sekunder for den første, jeg linkede til.




  1. Tilslutning af AnySQL Maestro til Salesforce.com

  2. Fejlfinding, der løber tør for arbejdstråde

  3. En forberedt erklæring, `HVOR .. IN(..)`-forespørgsel og sortering - med MySQL

  4. Hvordan får man medarbejderne med deres ledere