SQL 案例陈述:在 Where 子句内

SQL Case Statement: Inside Where Clause

我已经阅读了一些关于 'WHERE' 子句中 case 语句的其他问答,但我无法真正理解如何使用它。我将 post 下面的代码片段。我相信我不知道关于如何使用 case 语句的基本原则,这就是代码不会 compile/run 的原因。感谢您的帮助。

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 天的行。

我认为您不需要案例:

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)
    )

WHERE 子句中使用 CASE 时,您仍然需要定义操作的两端(即 [CASE CONDITION] = [SOMETHING])。这可能会变得棘手,具体取决于您要做什么,但最简单的方法是让您的 case 语句作为 true/false 类型的条件执行,以便您最终得到 [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

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