Ответ 1
A REGEXP может быть более эффективным, но вам нужно будет проверить его, например,
SELECT * from fiberbox where field REGEXP '1740|1938|1940';
Мой текущий запрос выглядит так:
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
A 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 $для указания точного соответствия. Это позволяет добавлять определенные соответствия с подстановочными масками в одном выражении. Однако вы также можете смешивать эти типы операторов, как вы можете видеть во втором приведенном примере.
Что касается производительности, я провел несколько небольших тестов против существующей таблицы и не обнаружил различий между моими вариантами. Однако я считаю, что производительность может быть проблемой с большими базами данных, большими полями, большим количеством записей и более сложными фильтрами.
Как всегда, используйте логику выше, поскольку она имеет смысл.
Если вы хотите узнать больше о регулярных выражениях, я рекомендую 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
)
Регулярный путь со списком значений
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 char.
Префикс "R" для Reg. Разумеется, конечно.
Вы можете получить желаемый результат с помощью Регулярные выражения.
SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]';
Мы можем протестировать вышеуказанный запрос, нажав скрипт SQL
SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]';
Мы можем протестировать вышеуказанный запрос, нажав скрипт SQL