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:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Verwenden Sie REGEXP Alternative:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
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:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Verwenden:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
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:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Verwenden Sie REGEXP Alternative:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
ODER gemischte Alternative:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
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.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")