Ошибка после переписывания оператора CASE WHEN с COALESCE - PullRequest
0 голосов
/ 02 октября 2019

В моем коде у меня есть оператор CASE WHEN, который включает 25 when с, теперь мне нужно использовать этот код на связанном сервере, поэтому я был вынужден изменить оператор CASE WHEN с помощью COALESCE, ноЯ думаю, что я не сделал это правильно.

Можете ли вы помочь мне проверить, в чем проблема?

До:

Case MRE100.RECTYQ
    When 'T' then
      Case MGC100.GNTIND
        when 01 then MSK500.S5MV01
        when 02 then MSK500.S5MV02
        when 03 then MSK500.S5MV03
        when 04 then MSK500.S5MV04
        when 05 then MSK500.S5MV05
        when 06 then MSK500.S5MV06
        when 07 then MSK500.S5MV07
        when 08 then MSK500.S5MV08
        when 09 then MSK500.S5MV09
        when 10 then MSK500.S5MV10
        when 11 then MSK500.S5MV11
        when 12 then MSK500.S5MV12
        when 13 then MSK500.S5MV13
        when 14 then MSK500.S5MV14
        when 15 then MSK500.S5MV15
        when 16 then MSK500.S5MV16
        when 17 then MSK500.S5MV17
        when 18 then MSK500.S5MV18
        when 19 then MSK500.S5MV19
        when 20 then MSK500.S5MV20
        when 21 then MSK500.S5MV21
        when 22 then MSK500.S5MV22
        when 23 then MSK500.S5MV23
        when 24 then MSK500.S5MV24
        when 25 then MSK500.S5MV25              
        else 0
      end
    when 'U' then MSK500.S5MVTT
    else 0
end

Что приводит к следующей ошибке: Msg 125, Level 15, State 4, Line 1 Case expressions may only be nested to level 10

Моя перезапись с помощью COALESCE:

COALESCE(
    Case when MRE100.RECTYQ = 'T' then MGC100.GNTIND 
         when MRE100.RECTYQ = '01' then MSK500.S5MV01
         when MRE100.RECTYQ = '02' then MSK500.S5MV02
         when MRE100.RECTYQ = '03' then MSK500.S5MV03
         when MRE100.RECTYQ = '04' then MSK500.S5MV04
         when MRE100.RECTYQ = '05' then MSK500.S5MV05
         when MRE100.RECTYQ = '06' then MSK500.S5MV06
         when MRE100.RECTYQ = '07' then MSK500.S5MV07
         when MRE100.RECTYQ = '08' then MSK500.S5MV08
         ELSE NULL
    END,
    Case when MRE100.RECTYQ = '09' then MSK500.S5MV09
         when MRE100.RECTYQ = '10' then MSK500.S5MV10
         when MRE100.RECTYQ = '11' then MSK500.S5MV11
         when MRE100.RECTYQ = '12' then MSK500.S5MV12
         when MRE100.RECTYQ = '13' then MSK500.S5MV13
         when MRE100.RECTYQ = '14' then MSK500.S5MV14
         when MRE100.RECTYQ = '15' then MSK500.S5MV15
         ELSE NULL
    END,
    Case when MRE100.RECTYQ = '16' then MSK500.S5MV16
         when MRE100.RECTYQ = '17' then MSK500.S5MV17 
         else 0
    end,
    case when MRE100.RECTYQ ='U' then MSK500.S5MVTT
         else 0
    end
)

Проблема:

Со вторым выражением я могу получить только результат первого условия:

when MRE100.RECTYQ = 'T' then MGC100.GNTIND

Некоторые картинки могут быть более четкими,

Это должно быть так:

enter image description here

Но получаетсябыть:

enter image description here

Ответы [ 3 ]

0 голосов
/ 02 октября 2019

Второй фрагмент кода, кажется, не является перезаписью первого, если я не ошибаюсь.

В первом случае вы используете MRE100.RECTYQ в первом выражении CASEи затем переменную MGC100.GNTIND во втором выражении CASE.

Case MGC100.GNTIND
    when 01 then MSK500.S5MV01

Однако во втором выражении CASE вы проверяете MRE100.RECTYQ все время.

Case when MRE100.RECTYQ = 'T' then MGC100.GNTIND 
     when MRE100.RECTYQ = '01' then MSK500.S5MV01
0 голосов
/ 02 октября 2019

Логика в этих двух операторах CASE различна.

В первом примере, когда MRE100.RECTYQ = 'T', вы выполняете второй оператор CASE для значения MGC100.GNTIND.

Во втором примере вы переходите к значению MGC100.GNTIND, как только выполняется условие MRE100.RECTYQ = 'T'.

0 голосов
/ 02 октября 2019

Ваша основная проблема заключается в том, что второе выражение CASE заканчивается условием ELSE, которое приводит к 0, если все остальные условия не выполнены. Как следствие, COALESCE никогда не идет к третьему выражению.

Итог, я думаю, что вы слишком усложняете вещи. CASE прекращает оценку условий, как только выполняется условие соответствия. Что касается проблем, вам не нужно COALESCE, и ваш код может быть выражен в виде одного CASE выражения, например:

CASE MRE100.RECTYQ
    WHEN 'T'  THEN MGC100.GNTIND 
    WHEN '01' THEN MSK500.S5MV01
    WHEN '02' THEN MSK500.S5MV02
    WHEN '03' THEN MSK500.S5MV03
    WHEN '04' THEN MSK500.S5MV04
    WHEN '05' THEN MSK500.S5MV05
    WHEN '06' THEN MSK500.S5MV06
    WHEN '07' THEN MSK500.S5MV07
    WHEN '08' THEN MSK500.S5MV08
    WHEN '09' THEN MSK500.S5MV09
    WHEN '10' THEN MSK500.S5MV10
    WHEN '11' THEN MSK500.S5MV11
    WHEN '12' THEN MSK500.S5MV12
    WHEN '13' THEN MSK500.S5MV13
    WHEN '14' THEN MSK500.S5MV14
    WHEN '15' THEN MSK500.S5MV15
    WHEN '16' THEN MSK500.S5MV16
    WHEN '17' THEN MSK500.S5MV17 
    WHEN 'U'  THEN MSK500.S5MVTT
    ELSE 0
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...