Meine aktuelle Anfrage sieht folgendermaßen aus:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Ich habe mich ein bisschen umgesehen und kann nichts Ähnliches wie ein LIKE IN () finden - ich stelle mir vor, dass es so funktioniert:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Irgendwelche Ideen? Denke ich nur falsch über das Problem nach - einen obskuren Befehl, den ich noch nie gesehen habe.
MySQL 5.0.77-Community-Protokoll
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Antworten:
Ein REGEXP mag effizienter sein, aber Sie müssten es vergleichen, um sicherzugehen, z
quelle
REGEXP
unerschwinglich langsam war, aber ich brauchte die Flexibilität von REGEXP, um meine Ergebnismenge weiter einzugrenzen, als esLIKE
möglich war. Ich habe eine Hybridlösung entwickelt, bei der ich beideLIKE
undREGEXP
; Obwohl derREGEXP
Anteil ausreicht, um die richtigen Ergebnisse zuLIKE
erzielen, konnte MySQL mit MySQL die Ergebnismenge erheblich reduzieren, bevor die langsamerenREGEXP
Kriterien verwendet werden mussten.(select group_concat(myColumn separator '|') from..)
Paul Dixons Antwort hat bei mir hervorragend funktioniert. Um dies hinzuzufügen, sind hier einige Dinge, die ich für diejenigen beobachtet habe, die an der Verwendung von REGEXP interessiert sind:
So führen Sie mehrere LIKE-Filter mit Platzhaltern durch:
Verwenden Sie REGEXP Alternative:
Werte in REGEXP-Anführungszeichen und zwischen | (ODER-) Operatoren werden als Platzhalter behandelt. In der Regel benötigt REGEXP Platzhalterausdrücke wie (. *) 1740 (. *), Um als% 1740% zu arbeiten.
Wenn Sie mehr Kontrolle über die Platzierung des Platzhalters benötigen, verwenden Sie einige der folgenden Varianten:
So erreichen Sie LIKE mit kontrollierter Platzhalterplatzierung:
Verwenden:
Wenn Sie ^ vor den Wert stellen, wird der Zeilenanfang angezeigt.
Wenn Sie $ nach dem Wert platzieren, wird das Zeilenende angezeigt.
Das Platzieren (. *) Verhält sich ähnlich wie der Platzhalter%.
Das . Gibt ein einzelnes Zeichen mit Ausnahme von Zeilenumbrüchen an. Platzieren. inside () mit * (. *) fügt ein sich wiederholendes Muster hinzu, das eine beliebige Anzahl von Zeichen bis zum Zeilenende angibt.
Es gibt effizientere Möglichkeiten, bestimmte Übereinstimmungen einzugrenzen, dies erfordert jedoch eine genauere Überprüfung der regulären Ausdrücke. HINWEIS: Nicht alle Regex-Muster scheinen in MySQL-Anweisungen zu funktionieren. Sie müssen Ihre Muster testen und sehen, was funktioniert.
So führen Sie mehrere LIKE- und NOT LIKE-Filter durch:
Verwenden Sie REGEXP Alternative:
ODER gemischte Alternative:
Beachten Sie, dass ich das NOT-Set in einem separaten WHERE-Filter getrennt habe. Ich experimentierte mit Negationsmustern, vorausschauenden Mustern und so weiter. Diese Ausdrücke schienen jedoch nicht die gewünschten Ergebnisse zu liefern. Im ersten Beispiel oben verwende ich ^ 9999 $, um die genaue Übereinstimmung anzuzeigen. Auf diese Weise können Sie bestimmte Übereinstimmungen mit Platzhalterübereinstimmungen im selben Ausdruck hinzufügen. Sie können diese Arten von Anweisungen jedoch auch mischen, wie Sie im zweiten aufgeführten Beispiel sehen können.
In Bezug auf die Leistung habe ich einige kleinere Tests mit einer vorhandenen Tabelle durchgeführt und keine Unterschiede zwischen meinen Variationen festgestellt. Ich stelle mir jedoch vor, dass die Leistung bei größeren Datenbanken, größeren Feldern, größeren Datensatzzahlen und komplexeren Filtern ein Problem darstellen könnte.
Verwenden Sie wie immer die obige Logik, da dies sinnvoll ist.
Wenn Sie mehr über reguläre Ausdrücke erfahren möchten, empfehle ich www.regular-expressions.info als gute Referenzseite.
quelle
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Sie können eine Inline-Ansicht oder eine temporäre Tabelle erstellen, diese mit Ihren Werten füllen und Folgendes ausgeben:
Dies kann jedoch dazu führen, dass Sie mehrere Zeilen für eine
fiberbox
solche Zeile zurückgeben'1740, 1938'
, sodass diese Abfrage besser zu Ihnen passt:quelle
Regexp Weg mit Werteliste
quelle
Entschuldigung, es gibt keine ähnliche Operation wie
LIKE IN
in MySQL.Wenn Sie den Operator LIKE ohne Join verwenden möchten, müssen Sie dies folgendermaßen tun:
Sie wissen, MySQL wird diese Abfrage nicht optimieren, FYI.
quelle
Beachten Sie einfach jeden, der versucht, mit dem REGEXP die "LIKE IN" -Funktionalität zu verwenden.
Mit IN können Sie Folgendes tun:
In REGEXP funktioniert dies nicht
Es muss in einer Zeile wie dieser stehen:
quelle
Operanden spiegeln
quelle
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en ist nur a oder b. Diese Methode durch Umdrehen von Oprandsselect * from, x where 'a,c' like concat('%',en,'%')
kann in SQL Injunction sicherer sein, ohne dass Zeichen wie $ ^ usw.field
das nur genau sein kanna
,b
oderc
dann sollten Sie verwendenfield IN ('a', 'b', 'c')
. Aber im allgemeinen Fall kann dies nie ersetzen ,field LIKE '%a%' OR field LIKE '%b%' OR ...
weil Feld selbst so etwas wie sein kann ,magic
der würde'magic' LIKE '%a%'
wahr , aber der Ausdruck'a,b,c' LIKE '%magic%'
falsch.Das wäre richtig:
quelle
Nur ein kleiner Tipp:
Ich bevorzuge die Variante RLIKE (genau der gleiche Befehl wie REGEXP ), da sie eher nach natürlicher Sprache klingt und kürzer ist. Nun, nur 1 Zeichen.
Das Präfix "R" steht für Reg. Exp. Natürlich.
quelle
Sie können das gewünschte Ergebnis mit Hilfe von regulären Ausdrücken erhalten .
Wir können die obige Abfrage testen, bitte klicken Sie auf SQL-Geige
Wir können die obige Abfrage testen, bitte klicken Sie auf SQL-Geige
quelle
[...]
ist ein Zeichensatz , was bedeutet, dass alle Zeichen im Satz ausreichen, um als Übereinstimmung angesehen zu werden. Also jeden Wert mit den Ziffern '0
,1
,3
,4
,7
,8
,9
oder das|
Pipe - Zeichen wird dieses Spiel.