Это ваше исходное состояние:
where l.country not like "%USA%" or "%CA%" ORDER BY l.state
Я предполагаю, что вы собираетесь это означает «страна не является ни США, ни CA.»
Если да, то вы бы написать так:
where l.country not like '%USA%' and l.country not like '%CA%' ORDER BY l.state
Но нет синтаксиса SQL для NOT LIKE 'X' OR 'Y'
. Предикат LIKE
имеет левый операнд и один правый операнд, не более.
Выражение, которое вы написали, является допустимым выражением, но не делает то, что вы думаете. Это похоже, как если бы вы написали это:
where (l.country not like "%USA%") or ("%CA%") ORDER BY l.state
То есть, два слагаемых, разделенных OR
, первым является LIKE
сравнение, а второй только один строковый литерал сам по себе. Это правильный термин в выражении, но он не делает ничего полезного. Это как письмо:
x = 6 * 8 + 0
Какое влияние имеет нуль в этом выражении? Никто.
Обновление: Я ошибся, я упустил один эффект запроса, когда вы его написали. Вы должны знать, что в булевом выражении, если вы используете два термина, не имеет значения, что такое первый член, если второй член всегда имеет значение ИСТИНА.
WHERE (some expression) OR (TRUE)
Это всегда так.
Литеральная строка '%CA%'
считается как истина, потому что это не пустая строка или NULL. Таким образом, в вашем исходном запросе предложение WHERE всегда верно независимо от страны.
Да, но это медленный подход, основанный на регулярном выражении. Что случилось с текущим – GurV
Какова ваша логика? Вы хотите совместить записи, в которых нет USA _and_ CA, или USA _or_ CA? –