Можно ли отменить предложение 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.
На ваш вопрос уже были ответы другие плакаты, я хотел бы отметить, что
delete from table where id <> 2
(или его варианты, а не id = 2 и т.д.) не будут удалять строки, где id равен NULL.
Если вы также хотите удалить строки с id = NULL:
delete from table where id <> 2 or id is NULL
delete from table where id <> 2
edit: чтобы исправить синтаксис MySQL
Используйте <>
, чтобы отменить предложение where.
Вы можете сделать следующее:
DELETE * FROM table WHERE NOT(id = 2);
WHERE id <> 2
должен работать нормально... Это то, что вы после?
Посмотрите на формальную логику и алгебру. Выражение типа
A & B & (D | E)
может быть отменено несколькими способами:
Очевидный способ:
!( A & B & ( D | E ) )
Вышеописанное также можно пересчитать, вам просто нужно запомнить некоторые свойства логических выражений:
!( A & B )
является эквивалентом (!A | !B)
.!( A | B )
является эквивалентом (!A & !B)
.!( !A )
является эквивалентом (A).Распределите NOT (!) по всему выражению, к которому оно применяется, инвертируя операторов и устраняя двойные негативы по мере продвижения:
!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, это приведет к ошибке. Поэтому вместо < > 1 вы должны проверить его следующим образом:
AND (isdelete is NULL or isdelete = 0)