Bestimmte Zeichen bei der Abfrage ignorieren

mikluxo

Benutzer
Beiträge
16
Hallo.
Wie kann ich die Suchvariable konfigurieren, damit die Zeichen "|" und "-" ignoriert werden, ohne dass ich Wildkardzeichen verwenden muss. Zur Veranschaulichung:

Ich habe in einer Tabelle folgende Begriffe:

1. Wald-Apfel
2. Strom|kabel

Die Suchvariable vom input-Feld ist $suche:

Die Abfrage in der Where-Klausel:

WHERE spaltenname LIKE '$suche' (hier möchte ich aus bestimmten Gründen keine % oder _ verwenden).

Ich möchte, dass die beiden oben genannten Begriffe rausgegeben werden, wenn in das Suchfeld "Waldapfel" und "Stromkabel" (also ohne "|" und "-") eingegeben werden.

Wie geht das?
 
Werbung:
Folgendes ist mit PostgreSQL gemacht, ich weiß nicht, ob es vergleichbare Möglichkeiten in MySQL gibt.

Code:
test=# create table mikluxo (id int primary key, begriff text);
CREATE TABLE
test=*# copy mikluxo from stdin;
Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.
Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile.
>> 1   banane
>> 2   Wald-Apfel
>> 3   Birne
>> 4   Zitrone
>> 5   Strom|kabel
>> \.
COPY 5


test=*# create extension pg_trgm;
CREATE EXTENSION
test=*# create index trgm_index on mikluxo using gist(begriff gist_trgm_ops);
CREATE INDEX
test=*# select *, similarity (begriff, 'Waldapfel') from mikluxo ;
id |  begriff  | similarity
----+-------------+------------
  1 | banane  |  0
  2 | Wald-Apfel  |  0.615385
  3 | Birne  |  0
  4 | Zitrone  |  0
  5 | Strom|kabel |  0.047619
(5 Zeilen)

test=*# select *, similarity (begriff, 'Waldapfel') from mikluxo where begriff % 'Waldapfel';
id |  begriff  | similarity
----+------------+------------
  2 | Wald-Apfel |  0.615385
(1 Zeile)

-- bzw. besser:
test=*# select *, similarity (begriff, 'Waldapfel') as "Waldapfel", similarity(begriff,'Stromkabel') as "Stromkabel" from mikluxo where begriff % 'Waldapfel' or begriff % 'Stromkabel';;
id |  begriff  | Waldapfel | Stromkabel
----+-------------+-----------+------------
  2 | Wald-Apfel  |  0.615385 |  0.047619
  5 | Strom|kabel |  0.047619 |  0.642857
(2 Zeilen)

Der % - Operator gibt alle Werte zurück, wo similarity über einen definierbaren Grenzwert liegt. Default 0.3, kann aber auch verändert werden.
 
Hallo alle.

Akretschmer, vielen Dank für deine Mühe. Ich kenne mich aber mit PostgreSQL überhaupt nicht aus. Dein Script hat mich recht verwirrt. Kann das irgenwie für Mysql umkonfiguriert werden?

Ukulele, deine Konfiguration ist leider nicht das, was ich brauche. Dieses Script ersetzt die Begriffe, indem es die Zeichen wegnimmt, und es werden "Waldapfel" und "Stromkabel" ausgegeben. Ich möchte aber, dass die Begriffe in ihrer Originalform (zusammen mit den Zeichen) ausgegeben werden. Nur bei der Suche sollten die Zeichen ignoriert werden, als ob man die Suchwörter zusammen mit dem Zeichen in das Suchfeld eingeben würde, oder als ob die Begriffe in der Tabelle ohne die Zeichen wären.

Kennt jemand vielleicht eine Lösung?
 
Ich ersetze die beiden Zeichen nur in der Suche der WHERE-Bedingung, ignoriere sie dort also. Als Spalte kannst du natürlich die ursprüngliche Spalte ausgeben.
 
Ich kenne mich aber mit PostgreSQL überhaupt nicht aus.

Macht nix, wir bieten auch Schulungen an ;-)

Dein Script hat mich recht verwirrt. Kann das irgenwie für Mysql umkonfiguriert werden?

Nun ja. MySQL ist technologisch halt im Vergleich zu PostgreSQL Steinzeit-Technologie. Volltext-Suche könnte aber vielleicht wirklich gehen, ich weiß nicht. Die gezeigte Lösung via pg_trgm ist aber sehr effektiv.
 
Ich ersetze die beiden Zeichen nur in der Suche der WHERE-Bedingung, ignoriere sie dort also. Als Spalte kannst du natürlich die ursprüngliche Spalte ausgeben.

Und wie geht das genau? Ich habe es genauso versucht und die Begriffe werden ohne die Zeichen ausgegeben. Wie kann ich die Abfrage so umändern, damit die Begriffe in ihrer ursprünglichen Form ausgegeben werden? Ich komme leider nicht auf die Lösung.
Vielen Dank.
 
Werbung:
Zurück
Oben