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

 218
Author: Lance Roberts, 2009-07-14

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'; 
 366
Author: Paul Dixon,
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.
 154
Author: David Carroll,
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
        )
 13
Author: Quassnoi,
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");
 11
Author: user136379,
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.

 7
Author: gahooa,
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||'%'
 3
Author: Ed Heal,
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.

 2
Author: Raúl Moreno,
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$'
 2
Author: Shaakir,
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"
));
 1
Author: Edmhs,
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

 0
Author: Z.I.J,
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