Ответ Пола Диксона сработал для меня блестяще. Чтобы добавить к этому, вот некоторые вещи, которые я наблюдал для тех, кто заинтересован в использовании REGEXP:
Чтобы выполнить несколько фильтров LIKE с подстановочными знаками:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Используйте REGEXP Alternative:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Значения в кавычках REGEXP и между | (ИЛИ) оператор рассматривается как символы подстановки. Как правило, для 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 Alternative:
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 как хороший справочный сайт.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")