Where/Case/IN逻辑

Where/Case/IN logic

我正在使用 SQL Server 2012 在 SSMS 中编写代码。 是否可以在where子句中有一个在特定条件下被跳过的case语句?

例如这是我第一次尝试的:

Where
    Case Substring(@@Servername,1,3)
        when 'BCR' Then SM.ItemCode in (1,3)
        When 'DCR' Then 'Some code to allow any Item Code'
        Else SM.ItemCode = 1
    End
    and SM.ItemDesc like '%Car%'

不喜欢这段代码,因为Case Statement只能return一个值。这是我在网上阅读后的第一个想法。但是,当我删除 in (1,3) 并将其设置为 = 3 时。它说我在 = 附近的语法不正确,所以它似乎也不喜欢那样。

此时我尝试了这个:

Where SM.ItemCode in 
    (
    Case Substring(@@Servername,1,3)
        when 'BCR' Then 1
        When 'DCR' Then 'So code to allow any Item Code'
        Else 1
    End,
    Case Substring(@@Servername,1,3)
        When 'BCR' Then 3
        Else 1
    End
    )
    and SM.ItemDesc like '%Car%'

这似乎解决了在 'BCR' 检查两个不同项目代码的问题,但我不确定如何解决 'DCR' 可能是任何项目代码的问题。

我的最新想法是添加另一个这样的案例:

Where 

Case SUBSTRING(@@Servername,1,3)
When 'DCR' then SM.ItemCode = any
Else
SM.ItemCode in 
    (
    Case Substring(@@Servername,1,3)
        when 'BCR' Then 1
        Else 1
    End,
    Case Substring(@@Servername,1,3)
        When 'BCR' Then 3
        Else 1
    End
    )
End
and SM.ItemDesc like '%Car%'

然而,这仍然在 = 错误附近给出了不正确的语法。

我想这可能是你想要的:

where
    case substring(@@Servername, 1, 3)
        when 'BCR' and SM.ItemCode in (1, 3) then 42
        when 'DCR' then 42
        else case when SM.ItemCode = 1 then 42 else 0 end
    end = 42 and ...

对我来说,这似乎等同于:

where (
        SM.ItemCode = 1
    or  @@Servername like 'BCR%' and SM.ItemCode = 3
    or  @@Servername like 'DCR%'
    ) and ...

case 表达式的结果是 "pseudo-boolean" 而不是 ItemCode。 end 之后的比较是针对我们任意的 "true" 值,它可以是我们想要的任何其他数字。结果只是标记应该被视为通过的案例。有时这种结构很有用,但可能在这里没有用。我将其包括在内是为了了解如何按照您最初的思路修复查询,并表明您已经非常接近解决方案。

就这样吧:

Where (
        (Substring(@@Servername,1,3) = 'BCR' and SM.ItemCode in (1,3)) or
        Substring(@@Servername,1,3) = 'DCR' or
        SM.ItemCode = 1
      ) and 
      SM.ItemDesc like '%Car%'