Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Bestimmte Zeichen bei der Abfrage ignorieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von mikluxo, 24 September 2016.

  1. mikluxo

    mikluxo Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    ach so, ich sollte vielleicht noch auf die Doku zu dieser Extension verweisen: PostgreSQL: Documentation: 9.5: pg_trgm

    Diese muß installiert werden, via CREATE EXTENSION. Das tut aber nicht weiter weh ;-)
     
  4. ukulele

    ukulele Datenbank-Guru

    Wie wäre es mit
    Code:
    SELECT * FROM tabelle WHERE replace(replace(spalte,'|',''),'-','') LIKE '%$suche%'
     
  5. akretschmer

    akretschmer Datenbank-Guru

    @ukulele: Dinge wie dies mögen funktionieren, aber das erfordert dann definitiv einen full-table-scan ;-)
     
  6. ukulele

    ukulele Datenbank-Guru

    Ein weiteres Opfer auf dem Altar von MySQL. Schmerzen sind einfach Gewöhnungssache...
     
  7. mikluxo

    mikluxo Benutzer

    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?
     
  8. Dukel

    Dukel Datenbank-Guru

  9. ukulele

    ukulele Datenbank-Guru

    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.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Macht nix, wir bieten auch Schulungen an ;-)

    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.
     
  11. mikluxo

    mikluxo Benutzer

    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.
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Unterscheide bitte zwischen dem, was Du angezeigt bekommst und dem, was in der Where-Condition steht. Wenn Du es so gemacht hast wie @ukulele es gesagt hat bekommst das angezeigt, was in der DB steht.
     
  13. mikluxo

    mikluxo Benutzer

    Aber Tatsache ist, dass ich "WaldApfel" und "Stromkabel" angezeigt bekomme, obwohl in der Tabelle "Wald-Apfel" und "Strom|kabel" stehen.
     
  14. akretschmer

    akretschmer Datenbank-Guru

    zeig Deine Query.
     
  15. mikluxo

    mikluxo Benutzer

    $abfrage = "select * from Tabellenname
    WHERE replace(replace(spaltenname, '|', ''), '-', '') LIKE '$suche'
    GROUP BY ID ORDER BY ID";
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden