| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

durch Zufall bin ich über den Operator RLIKE gestolplert. Das Teil richtet sich (wahrscheinlich genau wie meine Frage dazu) an den versierten User. Ich möchte folgendes umdrehen:

SELECT * FROM tabelle WHERE name RLIKE "anna|albert";

Ich hoffe, ich habe die Syntax richtig interpretiert ;-) Der Ausdruck soll ja entweder anna oder albert im String finden. Ich benötige genau das Umgekehrte, also dass er 1 zurück gibt, wenn er alle Suchbegriffe findet. Ist das mit RLIKE überhaupt möglich? Im Moment generiere ich den Suchausdruck immer mit

SELECT * FROM tabelle WHERE name LIKE "anna" AND name LIKE "albert";

Das RLIKE würde das Ganze wunderbar verkürzen und Traffic sparen.
News:
19.07.2011
muffi 1,4k 1 9
Ich weiß ja nich ob es sich bei dir hier nur um ein Beispiel handelt, aber 2 abfragen auf die gleiche Spalte im Like macht aus meiner Sicht recht wenig Sinn... ich hab noch nie gesehen, dass jemand zur gleichen Zeit den Namen "anna" und "albert" hat... es sei denn du speicherst mehrere vornamen in der gleichen Spalte oder gar Vor- und Nachname (was aber eher schlecht wäre)
Und solange du nicht mit Wildcards suchst, solltest du auch bei Strings das = nehmen (WHERE name = "anna"...), das verkürzt die Suchzeit zusätzlich enorm ^^
Karill Endusa 19.07.2011
Ich denke er hat die Namen nun nur als Beispiel genommen und sucht z.B. in einer Spalte mehrere Keywords. Dort würde das dann wieder Sinn machen, auch wenn man Keywords vorher splitten und dann in diverse Spalten schreiben könnte.
Dustin Klein 19.07.2011
Natürlich sind die beiden Namen nur ein Beispiel. Eine Suche mit = kommt bei Strings ja gar nicht in Betracht! Denn dann wäre ja "anna" != "Anna", mit like ist das nun einmal das Gleiche.
muffi 19.07.2011
2 Antworten
1
dein sql sollte vielleicht lauten (gerade aus dem manual abgeschrieben) *g*

select * from tabelle where (name REGEXP 'anna|albert') = 1;


was ich im konkreten fall nicht sehe, ist warum du solche fälle nicht mit der IN Klausel löst:

select * from tabelle where name IN ('anna', 'albert')

IN kann auch durch ein subselect befüllt werden, nicht unpraktisch.
19.07.2011
nabuchodonossor 1,3k 5
Wenn ich das richtig sehe (da es hier ja um eine Teilsuche in einem Varchar-Feld geht), müsste die Klammer genau gesagt heißen ('%anna%','%albert%')?
muffi 19.07.2011
nein, die in liste verträgt keine wildcards
nabuchodonossor 19.07.2011
IN ist doch auch wieder nur eine OR-Abfrage. Oder überseh' ich da was?
WolfgangKluge 19.07.2011
Der Einwand von WolfgangKluge ist allerdings richtig. Es scheint also keine kürzere Form zu geben als mehrere LIKEs zu verwenden.
muffi 20.07.2011
0
Hi,

ich kenn die mysql-implementierung nicht, aber wenn ein lookahead (?=..) verwendet werden kann, dann klappt's z.B. mit
(?=anna)(?=albert).
Der Punkt am Ende wird gebraucht, damit überhaupt etwas ausgewählt wird.

Wenn nicht, dann geht's noch mit
anna.*albert|albert.*anna
wobei ich das nur bedingt empfehlen würde...

Edit: Eventuell (ich kenn die Implementierung nicht) muss der gesamte Text ausgewählt werden (ist z.B. bei LIKE der Fall).
Dann wäre es
(?=.*anna)(?=.*albert).*
bzw.
.*(anna.*albert|albert.*anna).*


Wobei . alle Zeichen darstellt (EDIT: inklusive \n).

Sollen noch Wortgrenzen eingehalten werden (d.h. "Anna" aber nicht "Annabelle" oder "Johanna" sollen gefunden werden), musst Du noch [[:<:]] vor und [[:>:]] nach jedem Wort angeben:

(?=.*[[:<:]]anna[[:>:]])(?=.*[[:<:]]albert[[:>:]]).*
bzw.
.*[[:<:]](anna[[:>:]].*[[:<:]]albert|albert[[:>:]].*[[:<:]]anna)[[:>:]].*
19.07.2011
WolfgangKluge 1,0k 1 7

Stelle deine Mysql-Frage jetzt!