![]() |
Suche: Suchstrings
Hallo,
ich habe folgenden "Schönheitsfehler" bei meiner SELECT-Abfrage. Die SELECT-Abfrage sieht im Prinzip wie folgt aus:
Code:
So, wenn ich nun z.B. den Suchbegriff "der" eingebe, bekomem ich sowohl Buchtitel, in denen der als Artikel gebracuht wird als auch ein Wortbestandteil ist. Das ist zwar nicht ideal, damit könnte ich aber leben. Die Abfrage musste ich deshalb so gestalten, weil Buchtitel überwiegend ja auch mehreren Worten bestehen (z.B. "Kochen mit dem Blubb"). Wenn ich ohne Platzhalter (%) die Suche gestalte, wird dieses Buch nicht gefunden, wenn ich nur das zweite Wort eingebe.
SELECT * FROM buecher WHERE titel ="%'+Edit1.Text+'%"
ibt es eine Möglichkeit, das zu ändern? Ich hoffe, ihr habt mein Problem verstanden... wirklich schlimm ist es so ja nicht, es ist aber ziemlich störend, wenn man viele Suchergebnisse ausgegeben bekommt, die eigentlich nicht zum ursprünglichen Sinn des Suchbegriffs passen... |
Hi Kuckuckskind,
ich kann Dein Problem möglicherweise nicht genau verstehen. Könntest Du kurz anhand eines Beispiels beschreiben, was das Ergebnis der SELECT Abfrage sein soll? Also z.B. Eingabe soll sein: "der" Suchergebnis soll sein: "Mein Freund der Baum", "Der Prozess" Nicht im Ergebnis soll sein: "Wanderer, wo willst Du hin?" (Angabe der Datenbank wäre auch hilfreich, wegen unterschiedlicher Syntax) gruß, harrybo |
Moin Kuckuckskind,
wie Du schon sagtest, kommst Du um die % nicht herum, aber hast Du schon mal versucht den Suchbegriff um Blanks zu ergänzen (vorne und hinten)? Dann solltest Du einzeln stehende Worte herausfinden können. Ob die dann gesetzt werden sollen um ein einzeln stehendes Wort zu finden, oder nicht um den Begriff auch in einem Wortbestandteil zu finden, liesse sich ja über ein Option (z.B. mit CheckBox abfragen) realisieren. |
Hallo Kuckuckskind
Bei alle Datenbanken, welche SQL92 unterstützen (das heisst alle neueren DB-Server wie MS-SQLServer ab Version 6.5, alle Sybase Server nicht alter als 4 Jahre, Orakle ab Version 7 usw.) kann mit folgenden WHERE solche Abfragen gemacht werden:
Code:
Gruss
SELECT * FROM TableName WHERE StringField LIKE '%der%'
Xaver |
Hi,
der Trick mit den Blanks von Christian Seehase sollte funktionieren, falls es das ist, was Du suchst. Da der Suchbegriff der gesamte Titel sein kann, am Anfang, in der Mitte oder am Ende stehen kann, sähe die Abfrage dann so aus:
Code:
gruß, harrybo
SELECT * FROM Tabelle WHERE ((StringField LIKE '%der%') OR (StringField LIKE '%der %') OR (StringField LIKE '% der%'))
|
Moin harrybo,
korrigier mich bitte, wenn ich jetzt was falsches sage aber: %der% beinhaltet doch auch schon %der % und % der%, oder? (und entspricht somit Kuckuckskinds Ursprungsabfragemaske) |
Hallo Chris
Deine Aussage ist richtig, wenn man nach allem sucht, was 'der' enthält. Will man aber das Wort 'der' finden ist ein Blank nötig, da Du ansonsten auch das Wort 'wieder' findest. Das Blank wird jedoch problematisch, wenn das Wort am Anfang oder Ende des Strings steht. Beispiel: 'Der dumme Hund' kann mit '% der' nicht gefunden werden. Deshalb sollte man meiner Meinung nach, solche Entscheidungen dem Anwender überlassen. Gruss Xaver |
Hi Christian,
mein Fehler. Du sagst definitiv nichts Falsches. Kommt davon, wenn man auf die Schnelle antwortet. Die erste Bedingung sollte Suchbegriff = Titel sein, darf also gar keine Wildcards enthalten - also:
Code:
Das ganze kann man dann natürlich noch parametrisieren (prozedur, bzw. Query). Aber warten wir mal ab, was Kuckuckskind dazu meint...
SELECT * FROM Tabelle WHERE ((StringField LIKE 'der') OR (StringField LIKE '%der %') OR (StringField LIKE '% der%'))
gruß, harrybo |
Noch einen Hinweis im Zusammenhang mit LIKE. LIKE besitzt noch einige andere Möglichkeiten für den Ein-/Ausschluss von Rows. Hier ein kurzer Auszug aus der Help vom SQLServer:
Code:
Die gesamte Beschreibung der Funktionalität umfasst ca. 5 Seiten. Ich empfehle deshalb, die Beschreibung für den betreffenden DBServer zu lesen.
Mit NOT LIKE 'sys%' werden alle Objekte angezeigt, die nicht Systemtabellen sind. Sind insgesamt 32 Objekte vorhanden und LIKE ermittelt 13 dieser Objekte, die dem Muster entsprechen, ermittelt NOT LIKE die 19 Objekte, die dem Muster nicht entsprechen.
Mit einem Muster wie in LIKE '[^s][^y][^s]%' werden möglicherweise nicht immer die gleichen Namen gefunden. Anstelle von 19 Namen werden möglicherweise nur 14 angezeigt, da Namen, die mit s beginnen oder deren zweiter Buchstabe y oder deren dritter Buchstabe s ist, aus dem Resultset ebenso entfernt werden wie die Namen der Systemtabellen. Grund dafür ist die schrittweise Auswertung von Musterzeichenfolgen mit negativen Platzhalterzeichen - es wird Platzhalter für Platzhalter ausgewertet. Wenn der Vergleich an einem beliebigen Punkt der Auswertung fehlschlägt, wird das entsprechende Objekt aus dem Resultset entfernt. Gruss Xaver |
Zitat:
Hi, das (
Code:
) ist gar keien so schlechte Idee! Ich glaube, das werde ich mal ausprobieren!
SELECT * FROM Tabelle WHERE ((StringField LIKE 'der') OR (StringField LIKE '%der %') OR (StringField LIKE '% der%'))
Fällt euch vielleicht eine Lösung dazu ein, wie ich einen Titel finden kann, der aus mehreren Einzelwörtern besteht, wenn einzelen Worte aus dem Titel eingegeben wurden? Bsp.: Buchtitel "Mein Freund der Baum" eingegebener Suchstring: "Freund Baum" bisher habe ich meine Suchabfragen immer so formuliert, dass nur auseinander folgende Wörter gefunden werden konnten. Achja, ich benutze übrigens Paradox und bei meinem ersten Beitrag habe ich mich mal wieder verschrieben und statt "=" natürlich "LIKE" gemeint :roll: Gruß Thea |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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