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
当然,正如另一个答案所指出的,在这个特定的例子中,一个案例并不是真正必要的。但是,如果您遇到更复杂的情况,这可能会有所帮助。
我已经阅读了一些关于 '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
当然,正如另一个答案所指出的,在这个特定的例子中,一个案例并不是真正必要的。但是,如果您遇到更复杂的情况,这可能会有所帮助。