#mysql
#mysql
Вопрос:
Следующий запрос
SELECT * FROM items WHERE field1 NOT LIKE '%a%' AND NOT LIKE '%b%' AND
NOT LIKE '%c%'
эквивалентно
SELECT * FROM items WHERE field1 NOT IN ('a', 'b', 'c');
Вообще говоря, какой наилучший способ исключить определенные строковые значения из запроса MySQL?
Ответ №1:
Они не эквивалентны, потому что первый будет соответствовать:
Mike
Tom
Поскольку в приведенных выше словах нет A, B и C. но не
Apple Cobler
Который содержит A, B и C. Второй будет соответствовать чему угодно, кроме:
a
b
c
Я думаю, что ваш второй запрос (НЕ ВХОДИТ) — лучший способ ИСКЛЮЧИТЬ определенные строки, при условии, что вам не нужно сопоставлять подстановочные знаки с возможными значениями. Обратите внимание, что предложение LIKE является более дорогостоящим с точки зрения производительности, потому что оно должно выполнять прямую оценку для каждой строки, а не просто набирать индекс.
Ответ №2:
Ваш первый запрос:
SELECT * FROM items WHERE field1 NOT IN ('a', 'b', 'c');
такой же, как этот:
SELECT * FROM items WHERE field1 != 'a' AND field1 != 'b' AND field1 != 'c'
Таким образом, ваши два запроса НЕ эквивалентны. Вместо вашего первого запроса вы также могли бы сделать что-то вроде этого
SELECT * FROM items WHERE (field1 REGEXP '[abc]') = 0
Смотрите руководство по регулярному выражению для получения дополнительной информации
Ответ №3:
Нет, оба запроса не эквивалентны.
if (field1 = 'abcde')
тогда первый запрос проигнорирует эту строку, потому что ‘abcde’ удовлетворяет всем условиям
abcde Like '%a%'
abcde Like '%b%'
abcde Like '%c%'
Однако второй запрос не проигнорирует результат, потому что он извлечет все записи, где поле 1 не равно a, b и c.