![]() |
Datenbank: MSSQL Server • Version: 2000 • Zugriff über: ADO
Ähnlichkeitssuche in einer SQL-Datenbank???
Hallo!
Ich möchte eine Datenbank-Tabelle auf ein Wort durchsuchen, dabei sollen auch ähnliche Treffer angezeigt werden. Ich habe schon mal so etwas gemacht, es war aber normale Strings, die ich mithilfe Levenshtein-Algo vergliechen habe. Sicher gibt es so was in der Art auch für die Datenbanken. Jede korporative Datenbank, die ich bis heute gesehen habe, hatte so was an Bord, muss also möglich sein. Hat jemand schon so was gemacht? |
Re: Ähnlichkeitssuche in einer SQL-Datenbank???
Ja,
das habe ich mal für MSSQL geschrieben, als Prozedur (mit temporären Tabellen nachgebildet) Allerdings würde ich dafür jetzt wohl eine eigene Delphi-Library schreiben, diese dann in den Server integrieren. Somit kannst du Delphicode im Server ausführen. MfG Thorsten |
Re: Ähnlichkeitssuche in einer SQL-Datenbank???
Liste der Anhänge anzeigen (Anzahl: 1)
So, habe mich nochmal etwas näher damit beschäftigt.
Nachdem ich oben nur sehr ungenau war möchte ich jetzt etwas genauer werden... Ich habe mal eine DLL angelegt, die du in den Server integrieren kannst (siehe Anhang). In der Master-Datenbank unter "Erweiterte gespeicherte Prozeduren" musst du die DLL eintragen. Beim Namen muss angegeben werden: xp_Levenshtein Mit
SQL-Code:
könntest du jetzt schon auf die neue Funktion zugreifen.
DECLARE @d INT
EXEC master..xp_Levenshtein 'Text1', 'Text2', @r = @d OUTPUT SELECT @d Es geht aber auch noch etwas schöner... In deiner Datenbank unter "Benutzerdefinierte Funktionen" eine neue Funktion anlegen
SQL-Code:
Jetzt ist der Zugriff auf die Funktion auch innerhalb einer SQL-Abfrage möglich.
CREATE FUNCTION dbo.Levenshtein (@S1 VARCHAR, @S2 VARCHAR)
RETURNS INT AS BEGIN DECLARE @b INT EXEC master..xp_Levenshtein @S1, @S2, @a = @b OUTPUT RETURN @b END
SQL-Code:
Hoffe das hilft dir weiter.
SELECT *, dbo.Levenshtein(feld1, feld2)
FROM tabelle MfG Thorsten |
Re: Ähnlichkeitssuche in einer SQL-Datenbank???
@omata
Wow! Danke für deine Mühe! :) Muss gleich ausprobieren. Vielen Dank! |
Re: Ähnlichkeitssuche in einer SQL-Datenbank???
Beim MSSQL hast du 2 Möglichkeiten das sauber zu lösen ...
Zum einen gibt es die SOUNDEX Funktion
SQL-Code:
Zum Anderen kannst du dir mit DEFFERENCE() eine Suchfunktion mit "Trefferqualität-Ranking" bauen.
SELECT Vorname
,Name FROM Mitarbeiter WHERE SONDEX(Name) = SOUNDEX('meiher') -- findet Maier, Mayer, Meiner .... Kleines Beispiel:
SQL-Code:
CREATE PROCEDURE SucheMitarbeiter
@Vorname Varchar(20), @Name Varchar(20) AS Begin -- Liefert die eine Trefferliste der Mitarbeiter. -- Die besten Ergebnisse stehen oben, die ganz schlechten sind rausgefiltert ... DECLARE @MinimalPunkte INT SET @MinRank = 5 SELECT Vorname ,Name ,CASE WHEN DIFFERENCE(Vorname,@Vorname) IS NOT NULL THEN DIFFERENCE(Vorname,@Vorname) ELSE 4 END + CASE WHEN DIFFERENCE(Name,@Name) IS NOT NULL THEN DIFFERENCE(Name,@Name) ELSE 4 END AS [Rank] FROM Mitarbeiter WHERE ( DIFFERENCE(Vorname,@Vorname) > 2 ) AND ( UPPER( LEFT(Vorname,2) ) = UPPER( LEFT(@Vorname,2) ) AND ( DIFFERENCE(Name,@Name) > 2 ) AND ( UPPER( LEFT(Name,2) ) = UPPER( LEFT(@Name,2) ) AND ( CASE WHEN DIFFERENCE(Vorname,@Vorname) IS NOT NULL THEN DIFFERENCE(Vorname,@Vorname) ELSE 4 END + CASE WHEN DIFFERENCE(Name,@Name) IS NOT NULL THEN DIFFERENCE(Name,@Name) ELSE 4 END ) > @MinRank ORDER BY -- nach Rank sortieren CASE WHEN DIFFERENCE(Vorname,@Vorname) IS NOT NULL THEN DIFFERENCE(Vorname,@Vorname) ELSE 4 END + CASE WHEN DIFFERENCE(Name,@Name) IS NOT NULL THEN DIFFERENCE(Name,@Name) ELSE 4 END DESC End Beschreibungen zu den Funktionen findest du schnell über Google "MSDN SQL DIFFERENCE" bzw. "MSDN SQL SOUNDEX" Mit persönicch gefällt die Variante mit dem Ranking ganz gut. weil Soundex manchmal etwas stur ist ... Falls du Fragen dazu hast können wir das morgen Abend mal durchsprechen ... Schöne Grüße, Jens |
Re: Ähnlichkeitssuche in einer SQL-Datenbank???
Danke für die Bespiele!
Werde ie mir jetzt genauer anschauen :) |
Re: Ähnlichkeitssuche in einer SQL-Datenbank???
Ich musste heute leider feststellen, dass ich in meiner Funktionsdeklaration einen Fehler gemacht habe. Sie muss so aussehen...
SQL-Code:
Gruss
CREATE FUNCTION dbo.Levenshtein (@S1 VARCHAR(100), @S2 VARCHAR(100))
RETURNS INT AS BEGIN DECLARE @b INT EXEC master..xp_Levenshtein @S1, @S2, @a = @b OUTPUT RETURN @b END Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz