MySQL jak w ()?
Moje obecne zapytanie wygląda tak:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Trochę się rozglądałem i nie mogę znaleźć niczego podobnego do podobnego w () - wyobrażam sobie, że działa tak:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Jakieś pomysły? Czy ja 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-community-log
10 answers
A REGEXP Może być bardziej wydajne, ale trzeba by to porównać, aby mieć pewność, np.
SELECT * from fiberbox where field REGEXP '1740|1938|1940';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 18:23:44
Odpowiedź Paula Dixona zadziałała genialnie dla mnie. Aby dodać do tego, oto kilka rzeczy, które zaobserwowałem dla osób zainteresowanych użyciem REGEXP:
Aby wykonać wiele podobnych filtrów 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 regularnych i pomiędzy operatorem / (OR) są traktowane jako symbole wieloznaczne. Zazwyczaj Wyrażenie regularne wymaga wyrażeń wieloznacznych, takich jak (.*)1740 (.* ) do pracy jako %1740%.
Jeśli potrzebujesz większej kontroli nad umieszczaniem w niektórych wariantach używa się symbolu wildcard:
Aby osiągnąć jak z kontrolowanym umieszczeniem Wildcard:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Użycie:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Umieszczenie ^ przed wartością oznacza początek linii.
Umieszczenie $ PO wartości wskazuje koniec linii.
Pozycjonowanie (.* ) zachowuje się podobnie do % wildcard.
The . wskazuje dowolny pojedynczy znak, z wyjątkiem podziałów linii. Miejsce . inside () with * (.* ) dodaje powtórzenie wzór wskazujący dowolną liczbę znaków do końca wiersza.
Istnieją bardziej efektywne sposoby zawężania określonych dopasowań, ale wymaga to więcej przeglądu wyrażeń regularnych. Uwaga: nie wszystkie wzorce regex wydają się działać w instrukcjach MySQL. Musisz przetestować swoje wzorce i zobaczyć, co działa.
Wreszcie, aby uzyskać wiele filtrów podobnych i nie podobnych:
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 alternatywa Mieszana:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Zawiadomienie Oddzieliłem zestaw nie w oddzielnym filtrze gdzie. Eksperymentowałem z wykorzystaniem wzorców negujących, wzorców perspektywicznych i tak dalej. Jednak te wyrażenia nie wydają się przynosić pożądanych rezultatów. W pierwszym przykładzie powyżej, używam ^9999$ do wskazania dokładnego dopasowania. Umożliwia to dodawanie dopasowań z symbolami wieloznacznymi w tym samym wyrażeniu. Można jednak również mieszać te typy instrukcji, jak widać w drugim przykładzie.
Jeśli chodzi o wydajność, biegłem kilka drobnych testów na istniejącą tabelę i nie stwierdzono różnic między moimi wariacjami. Jednak wyobrażam sobie, że wydajność może być problemem z większymi bazami danych, większymi polami, większą liczbą rekordów i bardziej złożonymi filtrami.
Jak zawsze, użyj logiki powyżej, jak ma to sens.
Jeśli chcesz dowiedzieć się więcej o wyrażeniach regularnych, polecam www.regular-expressions.info jako dobra strona odniesienia.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 17:54:46
Możesz utworzyć widok inline lub tabelę tymczasową, wypełnić ją wartościami i wydać to:
SELECT *
FROM fiberbox f
JOIN (
SELECT '%1740%' AS cond
UNION ALL
SELECT '%1938%' AS cond
UNION ALL
SELECT '%1940%' AS cond
) с
ON f.fiberBox LIKE cond
To jednak może zwrócić wiele wierszy dla fiberbox
, który jest czymś w rodzaju '1740, 1938'
, więc to zapytanie może Ci lepiej pasować:
SELECT *
FROM fiberbox f
WHERE EXISTS
(
SELECT 1
FROM (
SELECT '%1740%' AS cond
UNION ALL
SELECT '%1938%' AS cond
UNION ALL
SELECT '%1940%' AS cond
) с
WHERE f.fiberbox LIKE cond
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 18:21:24
Regexp sposób z listą wartości
SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-12 10:28:07
Przepraszamy, w mysql nie ma operacji podobnej do LIKE IN
.
Jeśli chcesz użyć operatora LIKE bez join, musisz to zrobić w ten sposób:
(field LIKE value OR field LIKE value OR field LIKE value)
Wiesz, MySQL nie zoptymalizuje tego zapytania, FYI.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 18:22:11
Flip operands
'a,b,c' like '%'||field||'%'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 17:36:41
Mała wskazówka:
Wolę używać wariantu RLIKE (dokładnie tego samego polecenia co REGEXP ), ponieważ brzmi bardziej jak język naturalny i jest krótszy; cóż, tylko 1 znak.
Przedrostek" R " oznacza Reg. Exp. oczywiście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-06 18:33:20
Zwróć uwagę na każdego, kto próbuje wyrazić Wyrażenie regularne, aby użyć funkcji "LIKE IN".
IN pozwala na wykonanie:
field IN (
'val1',
'val2',
'val3'
)
In REGEXP this won ' t work
REGEXP '
val1$|
val2$|
val3$
'
Musi być w jednej linijce w ten sposób:
REGEXP 'val1$|val2$|val3$'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 01:24:54
To byłoby poprawne:
SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-27 16:14:56
Możesz uzyskać pożądany rezultat za pomocą wyrażeń regularnych .
SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]';
Możemy przetestować powyższe zapytanie Proszę kliknąć SQL
SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]';
Możemy przetestować powyższe zapytanie Proszę kliknąć SQL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-04 12:26:22