Sql server 2012 Where/Case/IN逻辑
我正在使用SQL Server 2012在SSMS中编写代码。 在where子句中是否可能有在某些条件下被跳过的case语句 例如,这是我第一次尝试的: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 =
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。。。每个数字都有。