【问题标题】:Where/Case/IN logicWhere/Case/IN 逻辑
【发布时间】:2015-10-29 20:37:01
【问题描述】:

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

然而,这仍然在 = 错误附近给出不正确的语法。

【问题讨论】:

  • case 表达式的结果是一个值而不是更多逻辑。
  • 如果您可以发布您的数据是什么样的以及您的查询的预期结果是什么,这将是有帮助的。

标签: sql-server-2012 case where-clause any


【解决方案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%'

【讨论】:

  • 非常感谢,这完全符合我的要求。从 BCR 获取两个代码,从 DCR 获取每个代码,从其他任何地方获取代码 1
【解决方案2】:

我想这可能是你想要的:

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

【讨论】:

  • 您的第二部分将像我使用的其他答案一样工作。但是我一开始并没有注意到它,我看了第一部分,看起来它不适用于 DCR。但是感谢您的帮助
  • 为什么when 'DCR' then 1 不做你想做的事?我试图帮助您了解 case 的工作原理。
  • 因为当 'DCR' 我需要它等于每个数字。它应该等于 1,等于 2,等于 3……对于每个数字。
猜你喜欢
  • 2012-03-12
  • 2020-09-13
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多