我正在使用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附近给出了错误的语法。
答案 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%'