Moje obecne zapytanie wygląda następująco:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Rozejrzałem się i nie mogę znaleźć czegoś podobnego do LIKE IN () - wyobrażam sobie, że działa to tak:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Jakieś pomysły? Czy po prostu myślę o problemie w niewłaściwy sposób - jakieś niejasne polecenie, którego nigdy nie widziałem.
MySQL 5.0.77-dziennik społeczności
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Odpowiedzi:
REGEXP może być bardziej skuteczny, ale trzeba by benchmarku to, aby mieć pewność, np
źródło
REGEXP
był zbyt powolny, ale potrzebowałem elastyczności REGEXP, aby zawęzić mój zestaw wyników bardziej niżLIKE
mógłbym to zapewnić. Wymyśliłem rozwiązanie hybrydowe, gdzie użyłem zarównoLIKE
aREGEXP
; pomimo tego, żeREGEXP
część jest wystarczająca do uzyskania poprawnych wyników, użycieLIKE
również pozwoliło MySQL na znaczne zmniejszenie zestawu wyników przed użyciem wolniejszychREGEXP
kryteriów.(select group_concat(myColumn separator '|') from..)
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:
Użyj alternatywy REGEXP:
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:
Posługiwać się:
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:
Użyj alternatywy REGEXP:
LUB Mieszana alternatywa:
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ą.
źródło
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Możesz utworzyć widok wbudowany lub tabelę tymczasową, wypełnić go swoimi wartościami i wydać to:
To jednak może zwrócić ci wiele wierszy dla
fiberbox
czegoś'1740, 1938'
, co jest podobne , więc to zapytanie może lepiej ci pasować:źródło
Ponowne wyodrębnianie z listą wartości
źródło
Przepraszamy, nie ma podobnej operacji jak
LIKE IN
w mysql.Jeśli chcesz używać operatora LIKE bez łączenia, musisz to zrobić w ten sposób:
Wiesz, MySQL nie zoptymalizuje tego zapytania, FYI.
źródło
Pamiętaj tylko, że każdy, kto spróbuje użyć REGEXP, aby użyć funkcji „LIKE IN”.
IN pozwala na:
W REGEXP to nie zadziała
Musi być w jednym wierszu:
źródło
Odwróć operandy
źródło
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en jest tylko a lub b wykonujący tę metodę przez odwracanie oprandów,select * from, x where 'a,c' like concat('%',en,'%')
może być bezpieczniejszy w SQL Injunction bez potrzeby uciekania przed charakterem, takim jak $ ^ itd.field
może to być tylko dokładniea
,b
lubc
powinieneś użyćfield IN ('a', 'b', 'c')
. Ale w ogólnych przypadkach NIGDY nie można tego zastąpić,field LIKE '%a%' OR field LIKE '%b%' OR ...
ponieważ samo pole może być czymś,magic
co sprawiłoby, że'magic' LIKE '%a%'
prawda, ale wyrażenie'a,b,c' LIKE '%magic%'
fałszywe.To byłoby poprawne:
źródło
Mała wskazówka:
Wolę używać wariantu RLIKE (dokładnie to samo polecenie co REGEXP ), ponieważ brzmi bardziej jak język naturalny i jest krótszy; cóż, tylko 1 znak.
Prefiks „R” dotyczy Reg. Exp., Oczywiście.
źródło
Możesz uzyskać pożądany wynik za pomocą wyrażeń regularnych .
Możemy przetestować powyższe zapytanie, kliknij skrzypce SQL
Możemy przetestować powyższe zapytanie, kliknij skrzypce SQL
źródło
[...]
to zestaw znaków , co oznacza, że dowolna z postaci w zestawie jest wystarczająca, aby być postrzegana jako dopasowanie. Więc dowolną wartość z cyfr '0
,1
,3
,4
,7
,8
,9
lub|
postać rura będzie pasował do tego.