是否有可能否定where子句?
EG
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
编辑:更正MySQL的语法
您可以执行以下操作:
DELETE * FROM table WHERE NOT(id = 2);
使用<>
否定where子句。
回顾形式逻辑和代数。一个表达式
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会影响优化器可以或不可以执行的操作。您可能会得到一个不太理想的查询计划。
WHERE id <> 2
应该工作得很好......这就是你追求的吗?
是。如果记忆为我服务,那应该有用。我们你可以使用:
DELETE FROM table WHERE id <> 2
我刚刚解决了这个问题。如果使用<>或不使用变量,即null,则会导致false。因此,而不是<> 1,你必须像这样检查它:
AND (isdelete is NULL or isdelete = 0)