【问题标题】:SQL: Can I negate a condition in a where clause?SQL:我可以否定 where 子句中的条件吗?
【发布时间】:2013-08-10 16:55:44
【问题描述】:

我想检查一个布尔值是否为真,然后在 WHERE 子句中决定使用什么条件。

假设布尔变量是@checkbool:

SELECT *
FROM TableA A
WHERE
    --if @checkbool is true, run this
    A.Id = 123

    --if @checkbool is false, run this
    A.Id <> 123

有没有办法否定条件?就像在 C++ 中一样,你可以这样做 if !(condition)。

如果不是,解决这个问题的最佳方法是什么?

谢谢!

【问题讨论】:

  • 如果 sql 中的条件被称为 CASE WHEN ...

标签: sql conditional-statements where-clause


【解决方案1】:

SQL 中的 ! 在 C 中的等价物是 NOT。但是,在您的情况下,您还需要其他东西:您需要建立一个条件,根据 @checkbool 的值在两个选择之间做出决定,如下所示:

SELECT *
FROM TableA A
WHERE (    (@checkbool) AND (A.Id =  123))
   OR ((NOT @checkbool) AND (A.Id <> 123))

【讨论】:

    【解决方案2】:

    这是一种解决方案:

    IF @Checkbool = 1
         SELECT * FROM Table A WHERE A.Id = 123
    ELSE
         SELECT * FROM Table A WHERE A.Id <> 123
    

    这是另一个只使用 WHERE 子句的例子:

    SELECT * 
    FROM Table A 
    WHERE
         (@Checkbool = 1 AND A.Id = 123)
         OR
         (@Checkbool = 0 AND A.Id <> 123)
    

    你放在 where 子句中的所有内容都必须是表达式的形式。因此,这种情况下的解决方案是将条件写成表达式。

    希望这会有所帮助。 :)

    【讨论】:

    • 你的第二个例子与接受的答案基本相同,但更容易阅读,imo
    【解决方案3】:
    select *
    from TableA A
    where
        (@checkbool = 1 and A.Id = 123) or
        (@checkbool = 0 and A.Id <> 123)
    

    【讨论】:

      【解决方案4】:

      如果 checkbool 是一个 coumn,那么这样的事情就可以了。(不是正确的 SQL 语法)

      WHERE (A.ID=123 AND A.checkbool=TRUE) OR (A.ID!=123 AND A.checkbool=TRUE)
      

      如果 checkbool 不是 cloumn,则将 A.checkbool 替换为 checkbool 的值。

      这是正确的 SQL

      WHERE ((checkbool) AND (A.Id =  123))OR ((NOT checkbool) AND (A.Id <> 123))
      

      【讨论】:

        【解决方案5】:

        您可以使用 IN 分句甚至 != 运算符,例如:

        A.Id NOT IN (123,x,y,z);
        

        A.Id != 123;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-08
          • 2014-11-01
          相关资源
          最近更新 更多