Можно ли отменить предложение where?
например
DELETE * FROM table WHERE id != 2;
Можно ли отменить предложение where?
например
DELETE * FROM table WHERE id != 2;
Ответы:
Вы можете сделать это
DELETE FROM table WHERE id NOT IN ( 2 )
ИЛИ
DELETE FROM table WHERE id <> 2
Как заметил @Frank Schmitt, вы также можете быть осторожны с значениями NULL. Если вы хотите удалить все, чего нет 2
(включая NULL), добавьте OR id IS NULL
в предложение WHERE.
!= NULL
не работают: «Вы не можете использовать операторы арифметического сравнения, такие как =, <или <>, для проверки на NULL». ( из документации MySQL ). Значит, нужно использовать IS NOT NULL
.
На ваш вопрос уже ответили другие постеры, я просто хочу отметить, что
delete from table where id <> 2
(или его варианты, не id = 2 и т. д.) не удаляют строки, где id равен NULL.
Если вы также хотите удалить строки с id = NULL:
delete from table where id <> 2 or id is NULL
Вернитесь к формальной логике и алгебре. Выражение вроде
A & B & (D | E)
может быть отменено двумя способами:
Очевидный способ:
!( A & B & ( D | E ) )
Вышесказанное также можно переформулировать, вам просто нужно запомнить некоторые свойства логических выражений:
!( A & B )
эквивалентно (!A | !B)
.!( A | B )
эквивалентно (!A & !B)
.!( !A )
эквивалентен (A).Распределите НЕ (!) По всему выражению, к которому оно применяется, инвертируя операторы и устраняя двойные отрицания по мере продвижения:
!A | !B | ( !D & !E )
Итак, в общем, любое предложение where может быть отменено в соответствии с вышеуказанными правилами. Отрицание этого
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
является
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
или
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Что лучше? Это очень зависимый от контекста вопрос. Только вы можете это решить.
Однако имейте в виду, что использование NOT может повлиять на то, что оптимизатор может или не может делать. Вы можете получить неоптимальный план запроса.
Да. Если мне не изменяет память, это должно сработать. Наши вы можете использовать:
DELETE FROM table WHERE id <> 2
Я как раз решал эту проблему. Если вы используете <> или не указан в переменной, то есть null, это приведет к false. Поэтому вместо <> 1 вы должны проверить это так:
AND (isdelete is NULL or isdelete = 0)
id != NULL
работает не так, как вы ожидаете.