Обновление нескольких столбцов с использованием одного регистра в SQL Server - PullRequest
1 голос
/ 31 января 2020

Можно ли обновить несколько столбцов одним оператором case, или оператор case должен повторяться для каждого столбца? Мне нужно обновить два столбца, которые используют одни и те же критерии случая и хотели бы сделать все это в одном утверждении случая. Это возможно? Вот пример того, что я пытаюсь сделать, используя два выражения case:

UPDATE #wrkcd
SET topdate = CASE 
                 WHEN stopdate < @currentdate AND wustopcd = 'W' THEN stopdate
                 WHEN stopdate > @currentdate AND minstopdate < @currentdate THEN @currentdate
                 WHEN stopdate > @currentdate AND minstopdate > @currentdate AND minstopdate < stopdate THEN minstopdate
                 WHEN stopdate < minstopdate AND wustopcd <> 'W' THEN minstopdate
                 ELSE stopdate
              END,
   wustopcd = CASE
                 WHEN stopdate < @currentdate AND wustopcd = 'W' THEN wustopcd
                 WHEN stopdate > @currentdate AND minstopdate < @currentdate THEN minwustopcd
                 WHEN stopdate > @currentdate AND minstopdate > @currentdate AND minstopdate < stopdate THEN minwustopcd
                 WHEN stopdate < minstopdate AND wustopcd <> 'W' THEN minwustopcd
                 ELSE wustopcd
              END

Спасибо за любую помощь, которую вы можете оказать.

1 Ответ

0 голосов
/ 31 января 2020

Вы можете использовать конструкцию values для оценки как одного выражения:

update t
     set t.topdate = tt.stopdate,
         t.wustopcd = tt.stopdate
from #wrkcd t cross apply
     ( values (CASE WHEN stopdate < @currentdate AND wustopcd = 'W' THEN stopdate
                    WHEN stopdate > @currentdate AND minstopdate < @currentdate THEN @currentdate
                    WHEN stopdate > @currentdate AND minstopdate > @currentdate AND minstopdate < stopdate THEN minstopdate
                    WHEN stopdate < minstopdate AND wustopcd <> 'W' THEN minstopdate
                    ELSE stopdate
               END)
     ) tt(stopdate);
...