【发布时间】:2011-09-03 15:50:01
【问题描述】:
可以否定where子句吗?
例如
DELETE * FROM table WHERE id != 2;
【问题讨论】:
-
仅供参考,
id != NULL没有按您的预期工作。
标签: mysql sql where-clause negate
可以否定where子句吗?
例如
DELETE * FROM table WHERE id != 2;
【问题讨论】:
id != NULL 没有按您的预期工作。
标签: mysql sql where-clause negate
最好的解决办法是使用
DELETE FROM table WHERE id NOT IN ( 2 )
【讨论】:
我只是在解决这个问题。如果使用 或不在变量上,即为 null,则会导致 false。因此,您必须像这样检查它,而不是 1:
AND (isdelete is NULL or isdelete = 0)
【讨论】:
您可以执行以下操作:
DELETE * FROM table WHERE NOT(id = 2);
【讨论】:
delete from table where id <> 2
编辑:更正 MySQL 的语法
【讨论】:
你可以这样做
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。” (from the MySQL documentation)。所以这意味着你必须使用 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)。将 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
【讨论】:
WHERE id <> 2 应该可以正常工作...这就是您所追求的吗?
【讨论】:
使用<> 否定where 子句。
【讨论】: