Ich möchte eine SQL-Abfrage schreiben, die nach einem Schlüsselwort in einem Textfeld sucht, aber nur, wenn es sich um eine "Ganzwortübereinstimmung" handelt (z. B. wenn ich nach "rid" suche, sollte sie nicht mit "arid" übereinstimmen, sollte es aber Match "a rid".
Ich benutze MySQL.
Glücklicherweise ist die Leistung in dieser Anwendung nicht kritisch, und die Datenbankgröße und die Zeichenfolgengröße sind beide angenehm klein, aber ich würde es vorziehen, dies in SQL zu tun, als in PHP, das es steuert.
quelle
'[[:<:]]" . $rid . "[[:>:]]'
Es wurde eine Antwort gefunden, um zu verhindern, dass die klassische Wortgrenze
[[::<::]]
mit Sonderzeichen kollidiert, z. B. @ # $% ^ & *Ersetzen..
SELECT * FROM table WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'
Mit diesem..
SELECT * FROM table WHERE keywords REGEXP '([[:blank:][:punct:]]|^)rid([[:blank:][:punct:]]|$)'
Letzteres stimmt überein (Leerzeichen, Tabulator usw.) || (Komma, Klammer usw.) || Anfang / Ende der Zeile. Eine 'fertigere' Wortgrenzenübereinstimmung.
quelle
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''([[[:blank:][:punct:]]' at line 3 SQLState: 42000 ErrorCode: 1064
verstehe : Irgendwelche Ideen?'([[[
Sie können
like
mit dem Platzhalter-Marker die Möglichkeiten abfangen (am Anfang, am Ende, in der Mitte und alleine). So etwas sollte ausreichen:Wählen Sie bla bla bla, wobei Spalte wie 'rid%' oder Spalte wie '% rid' oder Spalte wie '% rid%' oder column = 'rid'
quelle
or column like '% rid, %' or column like 'rid, %'
. Oder verwenden Sie die oben beschriebene Regex-Methode.Verwenden Sie Regexp mit Wortgrenzen. Wenn Sie jedoch auch eine akzentunempfindliche Suche wünschen, beachten Sie bitte, dass REGEXP ein Einzelbyte-Operator ist. Es lohnt sich also nicht, eine utf8_general_ci-Kollatierung zu haben. Die Übereinstimmung ist nicht akzentunempfindlich.
Geben Sie das Wort so an, wie es die (veraltete) PHP-Funktion sql_regcase () getan hat, damit sowohl der Akzent unempfindlich als auch das gesamte Wort übereinstimmen.
Eigentlich:
Mit utf8_general_ci können Sie eine Suche nach Gleichheit (WHERE-Feld = Wert) und ohne Akzent durchführen, jedoch keine vollständige Wortübereinstimmung angeben (Wortgrenzenmarkierungen nicht erkannt).
LIKE ermöglicht Ihnen die Suche ohne Berücksichtigung von Groß- und Kleinschreibung und Akzent, Sie müssen jedoch alle Kombinationen möglicher Zeichen für Wortgrenzen manuell angeben (Wortgrenzenmarkierungen werden nicht erkannt).
Wortgrenzen [[: <:]] und [[:>:]] werden in REGEXP unterstützt, bei dem es sich um Einzelbytefunktionen handelt. Führen Sie daher keine akzentunempfindliche Suche durch.
Die Lösung besteht darin, REGEXP mit Wortgrenzen zu verwenden und das Wort so zu ändern, wie es sql_regcase tut.
Wird auf http://www.nonsolodiete.it verwendet
quelle
select * from table where Locate('rid ', FieldToSearch) > 0 or Locate(' rid', FieldToSearch) > 0
Auf diese Weise können Sie herausfinden, wo ein Leerzeichen vor oder nach dem Leerzeichen steht. Sie können den Ansatz erweitern, um dies zu berücksichtigen.,?! und so weiter, nicht elegant, aber einfach.
quelle
Dies ist die beste Antwort, die ich mir bisher ausgedacht habe:
SELECT * FROM table WHERE keywords REGEXP '^rid[ $]' OR keywords REGEXP ' rid[ $]'
Ich hätte es vereinfacht, um:
SELECT * FROM table WHERE keywords REGEXP '[^ ]rid[ $]'
aber [^] hat eine spezielle Bedeutung von "NICHT ein Leerzeichen" anstelle von "Zeilenanfang oder Leerzeichen".
Wie vergleicht sich REGEXP mit mehreren LIKE-Bedingungen? (Nicht, dass die Leistung in dieser App wichtig ist.)
quelle