【问题标题】:How do I create a conditional WHERE clause?如何创建条件 WHERE 子句?
【发布时间】:2012-05-18 07:09:21
【问题描述】:

我需要一个这样操作的条件 where 子句:

Select *
From Table
If (@booleanResult)
Begin
  Where Column1 = 'value1'
End
Else
Begin
  Where column1 = 'value1' and column2 = 'value2'
End

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server-2005 where-clause


    【解决方案1】:

    你能做到以下几点吗?

    SELECT
        *
    FROM
        Table
    WHERE
        (@booleanResult = 1
        AND Column1 = 'value1')
    OR
        (@booleanResult = 0
        AND Column1 = 'value1'
        AND Column2 = 'value2')
    

    【讨论】:

    • 这不会在我的结果中给我 OR 的两边吗?
    • 我回到这个并改变了接受的答案。回过头来看,我想要的并不是我在问题中真正传达的内容。 Siva 回答了我想要的更多,但你准确地回答了所问的问题。对此感到抱歉 - 这是解决问题的公平方式。
    • 请记住,短路在 SQL 中并不总是像您期望的那样工作。由数据库供应商决定如何评估表达式。
    • 非常感谢@diaho,因为这帮助我刚刚有了一个条件,允许评估 ID = 1 或 (1,2,3,4) 中的 ID,具体取决于用户是否通过存储过程中的任何内容:)。
    【解决方案2】:

    您可以在WHERE 子句中轻松地对条件进行分组:

    WHERE
       (@BooleanResult=1 AND Column1 = 'value1')
    OR
       (@BooleanResult=0 AND Column1 = 'value1' AND column2 = 'value2')
    

    【讨论】:

    • 这不会在我的结果中给我 OR 的两边吗?
    • @Yatrix 是的,它会的。但是您永远不会同时匹配 BOTH,因为您正在检查 @Booleanresult 并且它不能同时是 10
    【解决方案3】:

    提供更简短的答案:

    Select *
    From Table
    Where Column1 = 'value1' and
          coalesce(column2, '') = (case when @BooleanResults = 0 
                                        then 'value1' 
                                        else coalesce( column2, '')
                                   end)
    

    【讨论】:

    • 你只是在编造句法吗?对什么 RDBMS 有效?
    • 糟糕,我留下了一些无关的字符。其余语法是标准 SQL,任何接受以“@”开头的局部变量的数据库都应该理解。
    • 答案更短,但代码不是。但是,+1 用于避免 短路,这使得它对更多 SQL 风格有用。
    【解决方案4】:

    根据有问题的脚本,无论变量@booleanResult 设置为真还是假,您似乎都需要Column1 的条件。因此,我已将该条件添加到 WHERE 子句中,并在其余条件中检查变量是否设置为 1 (true) 或是否设置为 0 (false) 那么它还会检查Column2 上的条件。

    这只是实现这一目标的另一种方式。

    创建和插入脚本:

    CREATE TABLE MyTable
    (
        Column1 VARCHAR(20) NOT NULL
      , Column2 VARCHAR(20) NOT NULL
    );
    
    INSERT INTO MyTable (Column1, Column2) VALUES
      ('value1', ''),
      ('',       'value2'),
      ('value1', 'value2');
    

    位变量设置为 1 (true) 时的脚本:

    DECLARE @booleanResult BIT
    SET @booleanResult = 1
    
    SELECT      *
    FROM        MyTable
    WHERE       Column1 = 'value1'
    AND         (        @booleanResult = 1
                    OR  (@booleanResult = 0 AND Column2 = 'value2')
                );
    

    输出

    COLUMN1 COLUMN2
    ------- -------
    value1  
    value1  value2
    

    位变量设置为0(假)时的脚本:

    DECLARE @booleanResult BIT
    SET @booleanResult = 0
    
    SELECT      *
    FROM        MyTable
    WHERE       Column1 = 'value1'
    AND         (        @booleanResult = 1
                    OR  (@booleanResult = 0 AND Column2 = 'value2')
                );
    

    输出

    COLUMN1 COLUMN2
    ------- -------
    value1  value2
    

    演示:

    Click here to view the demo in SQL Fiddle.

    【讨论】:

    • 正是我需要的。谢谢,湿婆。
    • 我只是认为你的例子是最完整的例子,对我个人来说也是最有帮助的。对所有人投赞成票,但只能有一个(接受)!
    • 我更改了我接受的答案。你给我的正是我想要的,但公平地说,正如你所说,他们给我的正是我所要求的。我只是没有问最好的问题。在这一点上,我不记得我真正想要的问题是什么。 =)
    猜你喜欢
    • 2015-08-27
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多