我已经阅读了其他一些关于' 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天的行。
答案 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
当然,正如另一个答案所指出的那样,在这个特定情况下,案件并不是必需的。但是,如果你有更复杂的条件,这可能会有所帮助。