是否可以否定 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 NOT(id = 2);
delete from table where id <> 2
编辑:更正 MySQL 的语法
用于<>
否定 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 NOT IN ( 2 )
是的。如果记忆对我有用,那应该可以。我们的您可以使用:
DELETE FROM table WHERE id <> 2
我只是在解决这个问题。如果使用 <> 或不在变量上,即为 null,则会导致 false。因此,您必须像这样检查它,而不是 <> 1:
AND (isdelete is NULL or isdelete = 0)