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

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

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

Ответ Пол Диксона блестяще работал для меня. Чтобы добавить к этому, вот некоторые вещи, которые я наблюдал для тех, кто заинтересован в использовании 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 $ для указания точного соответствия. Это позволяет добавлять определенные соответствия с подстановочными масками в одном выражении. Однако вы также можете смешивать эти типы операторов, как вы можете видеть во втором приведенном примере.

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

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

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

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

 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 ) 

Способ Regexp со списком значений

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

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

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

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

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

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

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

Просто обратите внимание, чтобы кто-то пытался использовать REGEXP для использования функции «LIKE IN».

IN позволяет:

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

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

 REGEXP ' val1$| val2$| val3$ ' 

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

 REGEXP 'val1$|val2$|val3$' 

Это было бы правильно:

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

Просто небольшой совет:

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

Префикс «R» для Reg. Разумеется, опыт.

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

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

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

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

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