Відповідь Пола Діксона блискуче спрацювала на мене. Щоб додати до цього, ось деякі речі, які я спостерігав для тих, хто зацікавлений у використанні REGEXP:
Щоб виконати кілька фільтрів LIKE за допомогою Wildcards:
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';
Розміщення ^ перед значенням вказує на початок рядка.
Розміщення $ після значення вказує на кінець рядка.
Розміщення (. *) Виглядає так само, як і символи% wild.
The. позначає будь-який окремий символ, крім розривів рядків. Розміщення. 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 як хороший довідковий сайт.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")