我在“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命令
为了解释上面的内容,我已经得到了适当的'SELECT‘和'FROM’语句。现在,我根据显示的变量(ecx LastShpd)过滤结果。我想让case语句做的是:当n.OnOrder =0时,我只想保留i.OnOrder = 0或i.LastShpd大于21天的行。
发布于 2016-06-20 16:31:26
我不认为你需要这样的理由
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)
)发布于 2016-06-20 16:38:01
在CASE子句中使用WHERE时,仍然需要定义操作的两边(即CASE条件= 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当然,正如另一个答案所指出的那样,在这种情况下,案件并不是真正必要的。然而,如果您有更复杂的条件,这可能是有帮助的。
https://stackoverflow.com/questions/37927410
复制相似问题