Вложенные операторы Case в SQL перед основным предложением ELSE - PullRequest
0 голосов
/ 22 марта 2019

Я пишу запрос, в котором я хотел бы использовать вложенный оператор 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'

(Поскольку каждый элемент обеда имеет разные созданные даты для того, когда их нужно выбросить, когда они должны быть проданы и когда им нужно хранить в холодильнике. Этот сценарий полностью составлен. Я не мог использовать свои фактические данные, поэтому я произвел очень ОЧЕНЬ выдуманные данные. Таким образом, если вам интересно, почему данные кажутся фальшивыми, это так).

Мой вопрос сводится к; Могу ли я написать запрос, в котором у меня есть несколько вложенных операторов case перед основным предложением ELSE, и если да, то каков правильный путь. Прямо сейчас говорится, что «Выражение не-булева типа определено в контексте, где ожидается условие»

Ответы [ 2 ]

1 голос
/ 22 марта 2019
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.

0 голосов
/ 22 марта 2019

Вот пример псевдокода для CASE.Сначала я получу работающий код «Спагетти», а затем построю его.

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' 
...