在 CASE WHEN 中使用 AND

Using AND within a CASE WHEN

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

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

我收到错误:

Incorrect syntax near 'and'.

是否可以在 CASE WHEN 中包含 AND

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 为真时才起作用,那么:

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

因此,如果 @showHidden,则 d.name 必须类似于 @filter,否则它必须类似于 d.name(始终为真)。

尝试:

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