【问题标题】:SQL WHERE condition is not equal to?SQL WHERE 条件不等于?
【发布时间】:2011-09-03 15:50:01
【问题描述】:

可以否定where子句吗?

例如

DELETE * FROM table WHERE id != 2;

【问题讨论】:

  • 仅供参考,id != NULL 没有按您的预期工作。

标签: mysql sql where-clause negate


【解决方案1】:

最好的解决办法是使用

DELETE FROM table WHERE id NOT IN ( 2 )

【讨论】:

    【解决方案2】:

    我只是在解决这个问题。如果使用 或不在变量上,即为 null,则会导致 false。因此,您必须像这样检查它,而不是 1:

     AND (isdelete is NULL or isdelete = 0)
    

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      DELETE * FROM table WHERE NOT(id = 2);
      

      【讨论】:

      • 如果值不是数字 WHERE NOT(id = 'two');
      【解决方案4】:
      delete from table where id <> 2
      



      编辑:更正 MySQL 的语法

      【讨论】:

        【解决方案5】:

        你可以这样做

        DELETE FROM table WHERE id NOT IN ( 2 )
        

        DELETE FROM table WHERE id <>  2 
        

        正如@Frank Schmitt 所说,您可能也需要注意 NULL 值。如果你想删除所有不是2(包括NULL)的东西,那么将OR id IS NULL添加到WHERE子句中。

        【讨论】:

        • 我尝试了这个命令几次.. 但它似乎没有工作,直到我意识到 MySQL 中的 DELETE 不使用 * ..
        • 好了,编辑答案以删除 * 感谢您指出。
        • 对于那些想知道为什么他们的!= NULL 不起作用的人的一般评论:“您不能使用算术比较运算符,例如 =、 来测试 NULL。” (from the MySQL documentation)。所以这意味着你必须使用 IS NOT NULL.
        【解决方案6】:

        其他发帖人已经回答了你的问题,我只想指出

         delete from table where id <> 2
        

        (或其变体,不是 id = 2 等)不会删除 id 为 NULL 的行。

        如果您还想删除 id = NULL 的行:

        delete from table where id <> 2 or id is NULL
        

        【讨论】:

          【解决方案7】:

          回顾形式逻辑和代数。像

          这样的表达式
          A & B & (D | E)
          

          可以通过几种方式否定:

          • 显而易见的方式:

            !( A & B & ( D | E ) )
            
          • 上面也可以重述,只需要记住逻辑表达式的一些性质即可:

            • !( A &amp; B ) 相当于 (!A | !B)
            • !( A | B ) 相当于 (!A &amp; !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 的使用会影响优化器能做什么或不能做什么。您可能会得到一个不太理想的查询计划。

          【讨论】:

            【解决方案8】:

            是的。如果记忆对我有用,那应该可以。 您可以使用我们的:

            DELETE FROM table WHERE id <> 2
            

            【讨论】:

              【解决方案9】:

              WHERE id &lt;&gt; 2 应该可以正常工作...这就是您所追求的吗?

              【讨论】:

                【解决方案10】:

                使用&lt;&gt; 否定where 子句。

                【讨论】:

                  猜你喜欢
                  • 2016-09-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-06
                  • 2019-12-18
                  • 2011-08-25
                  • 2010-09-26
                  • 2018-08-07
                  • 2016-04-12
                  相关资源
                  最近更新 更多