sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Fuzzy Matchning

En ganska snabb domänspecifik lösning kan vara att beräkna en stränglikhet med SOUNDEX och ett numeriskt avstånd mellan 2 strängar. Detta hjälper verkligen bara när du har många produktkoder.

Med hjälp av en enkel UDF som nedan kan du extrahera de numeriska tecknen från en sträng så att du sedan kan få 2200 av 'CLC 2200npk' och 1100 av 'CLC 1100' så att du nu kan bestämma närhet baserat på SOUNDEX-utgången för varje ingång samt närhet till den numeriska komponenten för varje ingång.

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

När det gäller generella algoritmer finns det ett par som kan hjälpa dig med olika grader av framgång beroende på datamängdsstorlek och prestandakrav. (båda länkarna har TSQL-implementationer tillgängliga)

  • Dubbel metafon – Den här algo kommer att ge dig en bättre matchning än soundex till priset av hastighet, men den är riktigt bra för stavningskorrigering.
  • Levenshtein Distance - Detta kommer att beräkna hur många knapptryckningar det skulle ta för att förvandla en sträng till en annan till exempel för att komma från 'CLC 2200npk' till 'CLC 2200' är 3, medan från 'CLC 2200npk' till 'CLC 1100' är 5.

Här är en intressant artikel som tillämpar båda algon tillsammans som kan ge dig några idéer.

Förhoppningsvis hjälper en del av det lite.

EDIT:Här är en mycket snabbare partiell Levenshtein Distance-implementering (läs inlägget, det kommer inte att ge exakt samma resultat som det normala). På min testtabell med 125 000 rader körs den på 6 sekunder jämfört med 60 sekunder för den första jag länkade till.




  1. Oracle dokumentation

  2. PostgreSQL-funktion / lagrad procedur CURRENT_TIMESTAMP ändras inte

  3. MySQL-variabelt format för en NOT IN-lista med värden

  4. SQL - Subtrahera ett utarmande värde från rader