Odpowiedź Paula Dixona działała dla mnie znakomicie. Aby dodać do tego, oto kilka rzeczy, które zauważyłem dla osób zainteresowanych używaniem REGEXP:
Aby osiągnąć wiele filtrów LIKE za pomocą symboli wieloznacznych:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Użyj alternatywy REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Wartości w cudzysłowach REGEXP i między | Operatory (OR) są traktowane jak symbole wieloznaczne. Zazwyczaj REGEXP wymaga wyrażeń wieloznacznych, takich jak (. *) 1740 (. *), Aby działał jako% 1740%.
Jeśli potrzebujesz większej kontroli nad rozmieszczeniem symbolu wieloznacznego, skorzystaj z niektórych z tych wariantów:
Aby osiągnąć LIKE dzięki kontrolowanemu rozmieszczaniu symboli wieloznacznych:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Posługiwać się:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Umieszczenie ^ przed wartością wskazuje początek linii.
Umieszczenie $ po wartości oznacza koniec wiersza.
Umieszczanie (. *) Działa podobnie jak% symbol wieloznaczny.
The. wskazuje dowolny pojedynczy znak, z wyjątkiem podziałów linii. Umieszczanie inside () z * (. *) dodaje powtarzający się wzór wskazujący dowolną liczbę znaków do końca linii.
Istnieją bardziej wydajne sposoby zawężania określonych dopasowań, ale wymaga to dokładniejszej oceny wyrażeń regularnych. UWAGA: Nie wszystkie wzorce wyrażeń regularnych wydają się działać w instrukcjach MySQL. Musisz przetestować swoje wzorce i zobaczyć, co działa.
Wreszcie, aby osiągnąć wiele filtrów LIKE i NOT LIKE:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Użyj alternatywy REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
LUB Mieszana alternatywa:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Zauważ, że oddzieliłem zestaw NIE w osobnym filtrze GDZIE. Eksperymentowałem z wykorzystaniem wzorów negujących, wzorów przyszłościowych i tak dalej. Jednak te wyrażenia nie przyniosły pożądanych rezultatów. W pierwszym przykładzie powyżej używam ^ 9999 $, aby wskazać dokładne dopasowanie. Umożliwia to dodawanie określonych dopasowań za pomocą symboli wieloznacznych w tym samym wyrażeniu. Można jednak również mieszać te typy instrukcji, jak widać w drugim wymienionym przykładzie.
Jeśli chodzi o wydajność, przeprowadziłem kilka drobnych testów na istniejącej tabeli i nie znalazłem żadnych różnic między moimi odmianami. Jednak wydaje mi się, że wydajność może być problemem w przypadku większych baz danych, większych pól, większej liczby rekordów i bardziej złożonych filtrów.
Jak zawsze, użyj powyższej logiki, ponieważ ma to sens.
Jeśli chcesz dowiedzieć się więcej o wyrażeniach regularnych, polecam www.regular-expressions.info jako dobrą stronę referencyjną.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")