Ответ Пола Диксона отлично сработал для меня. Чтобы добавить к этому, вот что я заметил для тех, кто заинтересован в использовании 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 и между | (ИЛИ) оператор рассматривается как символы подстановки. Как правило, для 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 как хороший справочный сайт.