我正在编写一个查询,其中我想使用嵌套的case语句。我可能可以使用IF函数,甚至可以合并使用,但是我特别希望用例语句。但是,总是欢迎在下面为其他人编写其他替代方案。另外,如果已经有解决方法,请直接给我指出,我已经搜索过很多次。
我的查询是这样的:
CASE WHEN priceddate is not null then
Case when lunchname = 'Mac' then
when createddate < '2/28/2019' then 'discard'
when createddate between '2/29/2019' and '3/10/2019' then 'Sale'
when createddate > '3/10/2019' then 'Refrigerate' end
End
Case when lunchname = 'Spaghetti' then
when createddate ....
when createddate ..... end
End
Case when lunchname = 'Burger' then .....end
End
ELSE (the main else clause that goes with the main case statement
End as 'ProductLabel'
(每个午餐项目在何时需要丢弃,何时需要出售以及何时需要冷藏时都有不同的创建日期。这种情况已经完全弥补了。我无法使用我的实际数据,所以我制作了非常虚构的数据。因此,如果您想知道为什么数据看起来是伪造的,那就是。
我的问题归结为;我是否可以编写查询,在主ELSE子句之前有多个嵌套的case语句,如果这样,正确的方法是什么?现在,它指出“在需要条件的上下文中指定的非布尔类型的表达式”
答案 0 :(得分:1)
Case
when priceddate is not null then
Case
when lunchname = 'Mac' then
CASE
when createddate < '2/28/2019' then 'discard'
when createddate between '2/29/2019' and '3/10/2019' then 'Sale'
when createddate > '3/10/2019' then 'Refrigerate'
end
when lunchname = 'Spaghetti' then
CASE
when createddate < '2/28/2019' then 'discard'
when createddate between '2/29/2019' and '3/10/2019' then 'Sale'
when createddate > '3/10/2019' then 'Refrigerate'
end
when lunchname = 'Burger' then
CASE
when createddate < '2/28/2019' then 'discard'
when createddate between '2/29/2019' and '3/10/2019' then 'Sale'
when createddate > '3/10/2019' then 'Refrigerate'
end
end
else '?'
End as 'ProductLabel'
仅供参考,这绝对是错误的方法。您应该有一个包含午餐名称的表,其中的各列指定了可以安全冷藏多长时间,到期前需要出售多长时间以及何时需要将其丢弃。然后,您可以执行基于集合的操作,而不使用CASE。
答案 1 :(得分:0)
这里是CASE伪代码的示例。我首先要使“ Spaghetti”代码工作,然后从那里开始构建。
CASE
WHEN priceddate is not null THEN
CASE
WHEN lunchname = 'Mac' THEN
GETDATE() -- or, enter code here
WHEN createddate < '2/28/2019' THEN
'discard'
WHEN createddate BETWEEN '2/29/2019' AND '3/10/2019' THEN
'Sale'
WHEN createddate > '3/10/2019' THEN
'Refrigerate'
END
ELSE
CASE WHEN lunchname = 'Spaghetti' THEN
WHEN createddate ... THEN
WHEN createddate ... THEN
END
END AS 'ProductLabel'