Мой текущий запрос выглядит так:
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
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Ответы:
REGEXP может быть более эффективным, но вы должны были бы эталоном это , чтобы быть уверенным, например ,
источник
REGEXP
была слишком медленной, но мне нужна была гибкость REGEXP, чтобы сузить свой набор результатов дальше, чемLIKE
мог бы обеспечить. Я придумал гибридное решение, в котором я использовал и то,LIKE
и другоеREGEXP
; несмотря на то, что этаREGEXP
часть достаточна для получения правильных результатов, использованиеLIKE
MySQL также позволило значительно сократить набор результатов, прежде чем использовать более медленныеREGEXP
критерии.(select group_concat(myColumn separator '|') from..)
Ответ Пола Диксона сработал для меня блестяще. Чтобы добавить к этому, вот некоторые вещи, которые я наблюдал для тех, кто заинтересован в использовании REGEXP:
Чтобы выполнить несколько фильтров LIKE с подстановочными знаками:
Используйте REGEXP Alternative:
Значения в кавычках REGEXP и между | (ИЛИ) оператор рассматривается как символы подстановки. Как правило, для REGEXP требуются символы подстановки, такие как (. *) 1740 (. *), Чтобы работать как% 1740%.
Если вам нужно больше контроля над размещением подстановочного знака, используйте некоторые из этих вариантов:
Чтобы выполнить LIKE с контролируемым размещением подстановочных знаков:
Использование:
Помещение ^ перед значением указывает начало строки.
Размещение $ после значения указывает на конец строки.
Размещение (. *) Ведет себя подобно символу%.
. указывает на любой отдельный символ, кроме разрывов строк. Размещение inside () с * (. *) добавляет повторяющийся шаблон, указывающий любое количество символов до конца строки.
Существуют более эффективные способы сужения конкретных совпадений, но для этого требуется более тщательный анализ регулярных выражений. ПРИМЕЧАНИЕ. Не все шаблоны регулярных выражений работают в инструкциях MySQL. Вам нужно будет проверить свои шаблоны и посмотреть, что работает.
Наконец, чтобы выполнить несколько фильтров LIKE и NOT LIKE:
Используйте REGEXP Alternative:
ИЛИ Смешанная Альтернатива:
Обратите внимание, что я отделил набор NOT в отдельном фильтре WHERE. Я экспериментировал с использованием отрицательных шаблонов, прогнозных шаблонов и так далее. Однако эти выражения, похоже, не дали желаемых результатов. В первом примере выше я использую ^ 9999 $, чтобы указать точное совпадение. Это позволяет добавлять конкретные совпадения с подстановочными совпадениями в одном выражении. Тем не менее, вы также можете смешивать эти типы операторов, как вы можете видеть во втором примере в списке.
Что касается производительности, я провел несколько небольших тестов по существующей таблице и не обнаружил различий между моими вариантами. Однако я думаю, что производительность может быть проблемой с большими базами данных, большими полями, большим количеством записей и более сложными фильтрами.
Как всегда, используйте логику выше, так как она имеет смысл.
Если вы хотите узнать больше о регулярных выражениях, я рекомендую www.regular-expressions.info как хороший справочный сайт.
источник
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Вы можете создать встроенное представление или временную таблицу, заполнить ее значениями и выдать следующее:
Это, однако, может вернуть вам несколько строк для
fiberbox
чего-то вроде'1740, 1938'
, так что этот запрос может подойти вам лучше:источник
Путь регулярного выражения со списком значений
источник
Извините,
LIKE IN
в MySQL нет операции, аналогичной .Если вы хотите использовать оператор LIKE без объединения, вам придется сделать это следующим образом:
Вы знаете, MySQL не будет оптимизировать этот запрос, к вашему сведению.
источник
Просто обратите внимание на тех, кто пытается использовать REGEXP для функциональности "LIKE IN".
IN позволяет делать:
В REGEXP это не сработает
Это должно быть в одной строке, как это:
источник
Перевернуть операнды
источник
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en - это только a или b, выполняющие этот метод путем перестановки операндов, чтоselect * from, x where 'a,c' like concat('%',en,'%')
может быть более безопасным в SQL Injunction, не нужно избегать символов, таких как $ ^ и т. д.field
может быть только точноa
,b
илиc
тогда вы должны использоватьfield IN ('a', 'b', 'c')
. Но в общем случае это НИКОГДАfield LIKE '%a%' OR field LIKE '%b%' OR ...
не может быть заменено, потому что само поле может быть чем-то вроде того,magic
что могло бы быть'magic' LIKE '%a%'
истинным, но выражение'a,b,c' LIKE '%magic%'
ложным.Это было бы правильно:
источник
Небольшой совет:
Я предпочитаю использовать вариант RLIKE (точно такая же команда, как и REGEXP ), так как он больше похож на естественный язык и короче; ну просто 1 символ
Префикс "R" для Reg. Эксп., Конечно.
источник
Вы можете получить желаемый результат с помощью регулярных выражений .
Мы можем проверить вышеуказанный запрос, пожалуйста, нажмите SQL скрипта
Мы можем проверить вышеуказанный запрос, пожалуйста, нажмите SQL скрипта
источник
[...]
является набором символов , означающим, что любого из символов в наборе достаточно, чтобы рассматривать как совпадение. Таким образом , любое значение с цифрами "0
,1
,3
,4
,7
,8
,9
или|
характер трубы будет соответствовать этому.