Sql server 2012 Where/Case/IN逻辑

Sql server 2012 Where/Case/IN逻辑,sql-server-2012,case,where-clause,any,Sql Server 2012,Case,Where Clause,Any,我正在使用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 =

我正在使用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语句只能返回一个值。这是我在网上阅读后的第一个想法。但是,当我移除(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%'

然而,这在=error still附近给出了不正确的语法。

我认为这可能是您想要的:

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表达式的结果是“伪布尔”而不是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%'

case
表达式的结果是一个值,而不是更多的逻辑。如果您可以发布数据的外观以及查询的预期结果,这将非常有用。非常感谢,这与我希望的完全一样。从BCR抓取了两个代码,从DCR抓取了每个代码,从每个地方抓取了代码1。你的第二部分将和我使用的另一个答案一样工作。然而,我并没有注意到它在一开始,我看了第一部分,看起来它不会为DCR工作。但是谢谢你的帮助,为什么当“DCR”然后1不做你想做的事?我试图帮助你理解
case
是如何工作的。因为当'DCR'时,我需要它等于每个数字。它应该等于1,等于2,等于3。。。每个数字都有。