MySQL LIKE IN()?

Мой текущий запрос выглядит так:

SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'

Я немного оглянулся и не могу найти ничего похожего на LIKE IN() - я предполагаю, что он работает следующим образом:

SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')

Любые идеи? Я просто думаю о проблеме неправильным образом - некоторая неясная команда, которую я никогда не видел.

MySQL 5.0.77-community-log

Ответ 1

A REGEXP может быть более эффективным, но вам нужно будет проверить его, например,

SELECT * from fiberbox where field REGEXP '1740|1938|1940'; 

Ответ 2

Ответ Пол Диксон блестяще работал у меня. Чтобы добавить к этому, вот некоторые вещи, которые я наблюдал для тех, кто заинтересован в использовании REGEXP:

Чтобы выполнить несколько фильтров LIKE с помощью подстановочных знаков:

 SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                           OR field LIKE '%1938 %'
                           OR field LIKE '%1940 %';  

Используйте альтернативу REGEXP:

 SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';

Значения в котировках REGEXP и между | (OR) обрабатываются как подстановочные знаки. Как правило, REGEXP потребует подстановочные выражения, такие как (. *) 1740 (. *), Чтобы работать как% 1740%.

Если вам нужно больше контролировать размещение шаблона, используйте некоторые из этих вариантов:

Чтобы выполнить LIKE с контролируемым расположением подстановочных знаков:

SELECT * FROM fiberbox WHERE field LIKE '1740 %'
                          OR field LIKE '%1938 '
                          OR field LIKE '%1940 % test';  

Использование:

SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
  • Размещение ^ перед значением означает начало строки.

  • Размещение $после того, как значение указывает конец строки.

  • Размещение (. *) ведет себя подобно шаблону%.

  • . указывает любой символ, кроме разрывов строк. Размещение. inside() с * (. *) добавляет повторяющийся шаблон, указывающий любое число символов до конца строки.

Есть более эффективные способы сужения конкретных совпадений, но для этого требуется более подробное рассмотрение регулярных выражений. ПРИМЕЧАНИЕ. Не все шаблоны регулярных выражений работают в операциях MySQL. Вам нужно будет проверить свои шаблоны и посмотреть, что работает.

Наконец, чтобы выполнить множественные фильтры LIKE и 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';

Используйте альтернативу REGEXP:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
                          OR field NOT REGEXP '1940 |^test ';

ИЛИ Смешанная альтернатива:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
                          OR field NOT REGEXP '1940 |^test '
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

Примечание. Я разделил NOT, установленный в отдельный фильтр WHERE. Я экспериментировал с использованием отрицательных шаблонов, перспективных шаблонов и т.д. Однако эти выражения, похоже, не дали желаемых результатов. В первом примере выше я использую ^ 9999 $для указания точного соответствия. Это позволяет добавлять определенные соответствия с подстановочными масками в одном выражении. Однако вы также можете смешивать эти типы операторов, как вы можете видеть во втором приведенном примере.

Что касается производительности, я провел несколько небольших тестов против существующей таблицы и не обнаружил различий между моими вариантами. Однако я считаю, что производительность может быть проблемой с большими базами данных, большими полями, большим количеством записей и более сложными фильтрами.

Как всегда, используйте логику выше, поскольку она имеет смысл.

Если вы хотите узнать больше о регулярных выражениях, я рекомендую www.regular-expressions.info как хороший ссылочный сайт.

Ответ 3

Вы можете создать встроенный просмотр или временную таблицу, заполнить ее значениями и выдать следующее:

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

Это, однако, может вернуть вам несколько строк для fiberbox, что-то вроде '1740, 1938', поэтому этот запрос может поместиться вам лучше:

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
        )

Ответ 4

Регулярный путь со списком значений

SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");

Ответ 5

К сожалению, в mysql нет операции, аналогичной LIKE IN.

Если вы хотите использовать LIKE-оператор без соединения, вам придется сделать это следующим образом:

(field LIKE value OR field LIKE value OR field LIKE value)

Вы знаете, MySQL не будет оптимизировать этот запрос, FYI.

Ответ 6

Флип-операнды

'a,b,c' like '%'||field||'%'

Ответ 7

Просто отметьте, кто хочет, чтобы REGEXP использовал функциональность "LIKE IN".

IN позволяет:

field IN (
'val1',
'val2',
'val3'
)

В REGEXP это не сработает

REGEXP '
val1$|
val2$|
val3$
'

Он должен быть в одной строке следующим образом:

REGEXP 'val1$|val2$|val3$'

Ответ 8

Это будет правильно:

SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));

Ответ 9

Просто немного подсказки:

Я предпочитаю использовать вариант RLIKE (точно такая же команда, как REGEXP), поскольку он больше похож на естественный язык и короче; ну, всего 1 char.

Префикс "R" для Reg. Разумеется, конечно.

Ответ 10

Вы можете получить желаемый результат с помощью Регулярные выражения.

SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]';

Мы можем протестировать вышеуказанный запрос, нажав скрипт SQL

SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]';

Мы можем протестировать вышеуказанный запрос, нажав скрипт SQL