Reihenfolge der Suchbegriffe bei SQL-Datenbankabfrage

Evich

Neuer Benutzer
Beiträge
2
Hallo,

ich habe keinerlei Ahnung von Datenbanken, aber ich möchte in meiner kleinen Firma eine Warenwirtschaftssoftware (WaWi) betreiben. Die Daten werden in einer Microsoft SQL-Datenbank vorgehalten.

Wenn wir nun bspw. einen unserer Warenartikel in der WaWi suchen, so kennen wir zwar Begriffe in der Artikelbezeichnung, aber nicht deren Reihenfolge. Deshalb finden wir die meisten Artikel nicht. Der Entwickler der WaWi meint, dass eine SQL-Datenbankabfrage die Begriffe stets nur von links nach rechts abarbeiten könne. Stimmt das?

Ich nenne mal ein Beispiel:
Die Bezeichnung des Artikels lautet "Apfel mit Stiel ohne Blätter, grün".
Wir tippen nun in das Suchfeld ein (ohne Anführungsstriche): "%grün %Stiel"
Die Suchfunktion findet nichts. Nur wenn wir die Begriffe in der richtigen Reihenfolge, also "%Stiel %grün" eintippen, findet die Suchfunktion den Artikel.

Also, stimmt es, dass man bei SQL-Abfragen stets die Reihenfolge der Begriffe im zu suchenden String einhalten muss?

Gruß
Evich
 
Werbung:
Jein. Deine Abfrage wird von der Wawi in folgenden Suchbefehl umgesetzt:

bezeichnung LIKE '%grün %Stiel%'

Soweit, so richtig. Damit findet die Datenbank dann nur Artikel die in der Bezeichnung zuerst ein grün drin haben und dann ein Stiel, nicht umgekehrt.

Es hindert den Programmierer aber nichts, in seiner Wawi mehrere Suchfelder zu machen und diese z.B. mit ODER zu verknüpfen oder andere Lösungen zu finden. Ohne Progrmamänderung geht es also nicht. Das hätte Dir der Entwickler sagen können oder er hat es Dir bereits gesagt.
 
Im Prinzip besteht das Problem darin das deine Anwendung alle Eigenschaften in einem Feld speichert anstatt jede Eigenschaft in einem eigenen wie es aus Datenbanksicht auch durchaus mehr Sinn machen würde.

Aber am Ende hat die Applikation alle Möglichkeiten. Die Software könnte auch deinen Suchstring zerlegen und aufgrund des %-Zeichens mehrere Bedingungen für die DB formulieren. Das ist natürlich aufwendiger aber machbar. Die WaWi ist aber offensichtlich recht einfach gehalten, das kann auch seine Vorzüge haben.
 
um es mal zu zeigen:

Code:
test=*# create table produkte(name text);
CREATE TABLE
test=*# insert into produkte values ('Apfel mit Stiel ohne Blätter, grün');
INSERT 0 1
test=*#
test=*#
test=*# select * from produkte where name like '%grün';
                name               
------------------------------------
 Apfel mit Stiel ohne Blätter, grün
(1 row)

test=*# select * from produkte where name like '%grün' or name like '%Stiel%';
                name               
------------------------------------
 Apfel mit Stiel ohne Blätter, grün
(1 row)

test=*# select * from produkte where name like '%grün' and name like '%Stiel%';
                name               
------------------------------------
 Apfel mit Stiel ohne Blätter, grün
(1 row)

test=*# insert into produkte values ('Apfel mit Stiel ohne Blätter, rot');
INSERT 0 1
test=*# select * from produkte where name like '%grün' or name like '%Stiel%';
                name               
------------------------------------
 Apfel mit Stiel ohne Blätter, grün
 Apfel mit Stiel ohne Blätter, rot
(2 rows)

test=*# select * from produkte where name like '%grün' and name like '%Stiel%';
                name               
------------------------------------
 Apfel mit Stiel ohne Blätter, grün
(1 row)

test=*#
 
Der Entwickler der WaWi meint, dass eine SQL-Datenbankabfrage die Begriffe stets nur von links nach rechts abarbeiten könne. Stimmt das?

Ich nenne mal ein Beispiel:
Die Bezeichnung des Artikels lautet "Apfel mit Stiel ohne Blätter, grün".
Wir tippen nun in das Suchfeld ein (ohne Anführungsstriche): "%grün %Stiel"
Die Suchfunktion findet nichts. Nur wenn wir die Begriffe in der richtigen Reihenfolge, also "%Stiel %grün" eintippen, findet die Suchfunktion den Artikel.

Wenn ich das so sehe ... bedienerfreundlich geht anders. Erstens sollten diese % da nicht mit reinkommen. Wenn das so direkt in die SQL-Abfrage geht, habt ihr vermutlich auch noch da eine SQL-Injection-Lücke. Bessere Idee wäre z.B., an Leerzeichen aufzutrennen und daraus eine AND oder OR - Verknüpfung zu machen. Z.B. OR, wenn da nur ein Leerzeichen ist, und AND, wenn da ein '+' steht. Das hinzufügen von % sollte die Applikation machen. Sowas in der Art ...
 
Die Frage die sich meistens stellt ist für was ist das Feld eigentlich gemacht. Ist das eine WaWi für Apfelhändler? Dann ist die vielleicht etwas zu simpel. Ist die WaWi für Autos und das ist eins von 100 Feldern das für Text gedacht aber jetzt für alle Produkteigenschaften genutzt wird die nichts mit Autos zu tun haben? Falsche Verwendung.
 
Vielen Dank schon mal. Nun erkenne ich halbwegs, worin das Problem liegt.

Sicherlich wäre es am besten, jede Eigenschaft in einer eigenen Tabelle abzulegen. Doch hierfür müsste nicht nur viel an der WaWi umgestrickt werden, sondern auch bei uns, damit wir unsere Artikelbezeichnungen eineindeutig und fehlerfrei erstellen. Das ist aber "Zukunftsmusik", da es über hundert Eigenschaften gibt. Hieran scheitert wohl auch der Vorschlag, für jede Eigenschaft ein eigenes Suchfeld in der WaWi einzubauen.

Die WaWi ist Business11. Man sollte sich nicht von der Aussage: "Mit der innovativen Volltextsuche in den Datenfenstern ist das Suchen von Daten nun ein Kinderspiel." beeindrucken lassen, denn ebendiese Volltextsuche krankt an der festen Reihenfolge der einzugebenden Suchbegriffe. Eigentlich soll die WaWi branchenübergreifend einsetzbar sein, aber für unsere Artikel eignet sie sich offenbar nicht.

Ja, bedienerfreundlich finde ich die Abfrage mit den Prozentzeichen auch nicht, aber mit diesem Mangel hätte ich leben können. AND- und OR-Verknüpfungen scheinen mir gar nicht das Problem zu sein, denn wir könnten mit einer festen AND-Verknüpfung arbeiten.

Der WaWi-Entwickler hat die Suchfunktion von einer Fremdfirma zugekauft. Offenbar kann er also nicht selbst die Suchfunktion umprogrammieren.

Aber ich werde die Anregungen von hier mal an den WaWi-Entwickler herantragen. Vielleicht könnte ein (Zusatz-)Programm die Suchbegriffe an den Leerstellen auftrennen und dann die Begriffe einzeln in der Datenbank abfragen. Anschließend müsst das Zusatzprogramm die DB-Antworten auswerten und im Ergebnis nur jene DB-Antworten ausgeben, die alle Suchbegriffe enthalten. So hab ich den Vorschlag von ukulele in #4 verstanden.
 
Werbung:
Wir können auch eigentlich nur raten was die Aplikation an die Datenbank weiter gibt. Der Hersteller wird sich dabei vermutlich nicht auf Anpassungen für einen Kunden einlassen, er hat aber natürlich durchaus alle Möglichkeiten das Verhalten zu ändern.

Nur wenn der Hersteller soweit geht das er Teile der Logik eventuell an die DB auslagert könnte man das mit überschaubarem Code selber anpassen. Wenn z.B. dieser Suchwert aus der Eingabemaske nur an eine Prozedur innerhalb der DB übergeben wird... aber leider macht das kaum eine Software, ich kenne keine.
 
Zurück
Oben