2017-02-23 4 views
1

Я пытаюсь сделать простой запрос, который имеет где положение о том, что нет матча 2 пунктов:MySQL запросов не так, как несколько текста соответствует

where l.country not like \"%USA%\" or \"%CA%\" ORDER BY l.state 

Я также попытался:

where l.country not like \"%USA%\" or l.country not like \"%CA%\" ORDER BY l.state 

также пытался:

where l.country not like (\"%USA%\", \"%CA%\") ORDER BY l.state 

Есть ли способ использовать «не нравится» с более чем одним совпадением?

+0

Да, но это медленный подход, основанный на регулярном выражении. Что случилось с текущим – GurV

+1

Какова ваша логика? Вы хотите совместить записи, в которых нет USA _and_ CA, или USA _or_ CA? –

ответ

1

Это ваше исходное состояние:

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 всегда верно независимо от страны.

+0

Благодарим вас за ответ и четкое объяснение! – Sackling

1

Вы можете использовать REGEXP с чередованием:

SELECT * 
FROM yourTable 
WHERE country NOT REGEXP '"%USA%"|"%CA%"' 

Примечания:

Вам не нужно, чтобы избежать двойных кавычек, которые появляются внутри строковых литералов в одинарных кавычках. Я думаю, ваш исходный запрос не будет работать, потому что вам нужно сравнить столбец, используя LIKE против любого другого столбца или строкового литерала, обычно в одинарных кавычках.

REGEXP не чувствителен к регистру, поэтому мы могли бы использовать usa и ca для получения того же результата, хотя это, по-видимому, не имеет значения в вашем случае.

Смежные вопросы