【问题标题】:SQL Case Statement: Inside Where ClauseSQL 案例语句:在 Where 子句中
【发布时间】:2016-06-20 16:24:28
【问题描述】:

我已经阅读了一些关于“WHERE”子句中的 case 语句的其他问答,但我无法真正理解如何使用它。我将在代码的 sn-p 下方发布。我相信我对如何使用 case 语句的基本原则一无所知,这就是代码无法编译/运行的原因。感谢您的帮助。

where i.status IN ('CR','L','O')
and i.FGCs > 0
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case
    When n.OnOrder IN ('0', '')
    Then i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)))
    End) 

按 i.LastShpd desc 排序

为了解释上面的内容,我已经得到了适当的“SELECT”和“FROM”语句。现在我正在根据显示的变量(ecx LastShpd)过滤结果。我希望 case 语句做的是:当 n.OnOrder = 0 时,我只想保留 i.OnOrder = 0 或 i.LastShpd 大于 21 天的行。

【问题讨论】:

  • 你需要在结尾和 (Case When n.OnOrder IN ('0', '') Then i.OnOrder = 0 or i.LastShpd

标签: sql where-clause case-statement


【解决方案1】:

我认为您不需要为此提供案例:

where i.status IN ('CR','L','O')
and i.FGCs > 0
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
     (n.OnOrder IN ('0', '') and i.OnOrder = 0) 
 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)
    )

重新阅读您的问题可能是另一种方式:

where i.status IN ('CR','L','O')
and i.FGCs > 0
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
     n.OnOrder Not IN ('0', '') 
    or i.OnOrder = 0 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)
    )

【讨论】:

  • 这是一个更好的解决方案。谢谢
  • @StevenDuncan - 很高兴它有帮助。我发现 CASE 在 Select 端比在 Where 端更有用。
【解决方案2】:

WHERE 子句中使用CASE 时,您仍然需要定义操作的两侧(即[CASE CONDITION] = [SOMETHING])。根据您想要做什么,这可能会变得很棘手,但最简单的方法是让您的 case 语句作为真/假类型的条件执行,以便您最终得到 [CASE] = 1 或 [CASE] = 0。

在你的情况下(意外的双关语!):

where i.status IN ('CR','L','O')
and i.FGCs > 0
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case
    When n.OnOrder IN ('0', '') AND (i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)) 
    THEN 1
    ELSE 0
    End) = 1

当然,正如另一个答案所指出的那样,在这种特定情况下,案例并不是真正必要的。但是,如果您有更复杂的条件,这可能会有所帮助。

【讨论】:

  • 感谢您向我解释案例。我没有意识到您必须将其设置为等于某个值。这将有助于我继续学习 SQL。
  • @StevenDuncan 您只需在 WHERE 子句中使用它时进行比较。您也可以在SELECT 中使用CASE,然后您根本不会进行比较。有趣的是,您还可以在ORDER BY 中使用CASE 进行动态排序。如何构建 SQL 取决于特定的上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多