SQL Case Statement:Where Where子句

时间:2016-06-20 16:24:28

标签: sql where-clause case-statement

我已经阅读了其他一些关于' WHERE'内部的案例陈述的问答。条款,但我无法真正理解如何使用它。我将在下面发布一段代码。我相信我不知道如何使用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排序

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

2 个答案:

答案 0 :(得分:3)

我认为你不需要一个案例:

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

答案 1 :(得分:1)

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

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

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

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