sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta sql-poster som innehåller liknande strängar

Om du verkligen vill definiera likhet på det exakta sätt som du har formulerat i din fråga, så skulle du - som du säger - behöva implementera Levensthein Avståndsberäkningen. Antingen i kod beräknad på varje rad som hämtas av en DataReader eller som en SQL Server-funktion.

Problemet som anges är faktiskt mer knepigt än det kan verka vid första anblicken, eftersom du inte kan anta att du vet vad som ömsesidigt delas element mellan två strängar kan vara.

Så förutom Levensthein Distance vill du förmodligen också ange ett minsta antal på varandra följande tecken som faktiskt måste matcha (för att tillräcklig likhet ska kunna dras).

Sammanfattningsvis:Det låter som ett alltför komplicerat och tidskrävande/långsamt tillvägagångssätt.

Intressant nog har du i SQL Server 2008 funktionen DIFFERENCE som kan användas till något liknande.

Den utvärderar det fonetiska värdet av två strängar och beräknar skillnaden. Jag är osäker på om du kommer att få det att fungera ordentligt för uttryck med flera ord som filmtitlar eftersom det inte hanterar mellanslag eller siffror och lägger för mycket tonvikt på början av strängen, men det är fortfarande en intressant predikat att vara medveten om.

Om vad du är faktiskt försöker beskriva är någon slags sökfunktion, då bör du undersöka funktionerna för fulltextsökning i SQL Server 2008. Den tillhandahåller inbyggt synonymordbokstöd, snygga SQL-predikat och en rankningsmekanism för "bästa matchningar"

EDIT:Om du vill eliminera dubbletter kanske du kan titta på SSIS Fuzzy Lookup och Fuzzy Group Transformation. Jag har inte provat detta själv, men det ser ut som ett lovande ledarskap.

EDIT2:Om du inte vill gräva i SSIS och fortfarande kämpar med prestandan för Levensthein Distance-algoritmen, kan du kanske prova den här algoritmen som verkar vara mindre komplex.



  1. Hämta föregående och nästa rad från rader valda med (WHERE) villkor

  2. Finns det en officiell rekommendation från Oracle om användningen av explicita ANSI JOINs kontra implicita joins?

  3. Fixa "profilnamnet är inte giltigt" när du skickar e-post från SQL Server

  4. Hur får man ett datum i formatet ÅÅÅÅ-MM-DD från ett TSQL-datumtidfält?