SQL中主要ELSE子句之前的嵌套Case语句

时间:2019-03-22 16:35:23

标签: sql nested case

我正在编写一个查询,其中我想使用嵌套的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语句,如果这样,正确的方法是什么?现在,它指出“在需要条件的上下文中指定的非布尔类型的表达式”

2 个答案:

答案 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'