是否可以否定where子句?
e.g。
DELETE * FROM table WHERE id != 2;
答案 0 :(得分:133)
你可以这样做
DELETE FROM table WHERE id NOT IN ( 2 )
OR
DELETE FROM table WHERE id <> 2
正如@Frank Schmitt所指出的,您可能也要小心NULL值。如果要删除不是2
的所有内容(包括NULL),请将OR id IS NULL
添加到WHERE子句中。
答案 1 :(得分:26)
其他海报已经回答了你的问题,我只想指出
delete from table where id <> 2
(或其变体,而不是id = 2等)不会删除id为NULL的行。
如果您还想删除id = NULL的行:
delete from table where id <> 2 or id is NULL
答案 2 :(得分:12)
delete from table where id <> 2
编辑:更正MySQL的语法
答案 3 :(得分:10)
您可以执行以下操作:
DELETE * FROM table WHERE NOT(id = 2);
答案 4 :(得分:7)
使用<>
否定where子句。
答案 5 :(得分:6)
WHERE id <> 2
应该可以正常工作......那就是你所追求的吗?
答案 6 :(得分:6)
回顾形式逻辑和代数。像
这样的表达式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会影响优化程序可以或不可以执行的操作。您可能会得到一个不太理想的查询计划。
答案 7 :(得分:3)
是。如果记忆为我服务,那应该有用。 我们可以使用:
DELETE FROM table WHERE id <> 2
答案 8 :(得分:2)
最好的解决方案是使用
DELETE FROM table WHERE id NOT IN ( 2 )
答案 9 :(得分:0)
我刚刚解决了这个问题。如果您使用&lt;&gt;或者不在变量上,即为null,它将导致false。所以而不是&lt;&gt; 1,你必须这样检查:
AND (isdelete is NULL or isdelete = 0)