在案例中使用AND

时间:2015-03-20 14:28:34

标签: sql sql-server case-when

我正在尝试将CASE WHEN添加到以下工作语句中:

Select ...
From...
Where 
    d.name like @filter and d.flags & 0x0F <> 0

我有一种情况,如果用户将BIT @showHidden参数设置为true,我希望过滤。这就是我的尝试:

SELECT...        
FROM...
WHERE
d.name like 
    CASE WHEN @showHidden = 'true' THEN
        @filter
    ELSE
        @filter and d.flags & 0x0F <> 0

我收到错误:

  

&#39;和&#39;附近的语法不正确。

是否可以在AND范围内拥有CASE WHEN

2 个答案:

答案 0 :(得分:5)

尝试:

SELECT...        
FROM...
WHERE d.name like @filter 
  and ( @showHidden = 'true' -- show everything 
      OR 
        d.flags & 0x0F <> 0  -- check if name should be hidden
      )

答案 1 :(得分:4)

使用CASE

正确结束END语句
SELECT...        
FROM...
WHERE
d.name like 
    CASE WHEN @showHidden = 'true' THEN
        @filter
    ELSE
        @filter 
    END and d.flags 

如果您想在WHEN中添加标准,那么正确的方法是:

SELECT...        
FROM...
WHERE
d.name like 
    CASE WHEN @showHidden = 'true' and d.flags THEN
        @filter
    ELSE
        @filter 
    END 

您可能有许多案件:

SELECT...        
FROM...
WHERE
d.name like 
    CASE 
        WHEN Condition1 AND Condition2 THEN
            @filter1
        WHEN Condition3 AND Condition4 THEN
            @filter2
        WHEN Condition5 THEN
            @filter3
        ELSE
            @filter4
    END 

ELSE用于确保在没有条件的情况下获得值。

<强>更新

在我的回答中,我试图提供有关CASE如何工作的一些信息,但并未真正回答整个问题。

如果您想要一个如何在此使用CASE的示例,并且您希望@filter仅在@showHidden为true时才能工作:

d.name like 
    CASE 
        WHEN @showHidden = 'true' THEN @filter
        ELSE d.name
    END

因此,如果@showHidden那么d.name必须与@filter一样,那么它必须像d.name(始终为真)。