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%'
我正在使用 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%'