Where / Case / IN逻辑

时间:2015-10-29 20:37:02

标签: 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 = 1
    End
    and SM.ItemDesc like '%Car%'

它不喜欢这段代码,因为Case语句只能返回一个值。在线阅读后我的第一个想法。然而,当我删除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%'

然而,这仍然在= error still附近给出了错误的语法。

2 个答案:

答案 0 :(得分:1)

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

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之后的比较反对我们的任意“真实”值,这可能是我们想要的任何其他数字。结果只是标记应被视为通过的案例。有时这种结构很有用,但可能不在这里。我将其包含在内,以了解如何在原始思路中修复查询,并证明您与解决方案非常接近。

答案 1 :(得分:1)

就像这样:

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%'