2016-06-29 6 views
1

Это второй вопрос, который я задаю в отношении преобразования из IIF в CASE.Преобразование IIF в CASE (SQL Server 2012)

То, что меня смущает от IIF, - это когда одно из условий становится вторым IIF. Когда это происходит в коде IIF, у меня возникли проблемы с пониманием того, нужно ли мне просто указать его как WHEN, или если мне нужно запустить вложенный CASE.

Это заявление IIF, в котором требуется преобразование.

IIF(([FirstPublicationDate] IS NULL), IIF(([PublicationDate] IS NULL), GETDATE(), [PublicationDate]), [FirstPublicationDate]) 

Благодарим за помощь.

+0

Try _executing_ него в голове, как если бы вы были на компьютере, и вы должны понять логику. – litelite

ответ

2

Сделать древовидную диаграмму:

           --- GETDATE() 
             (null)/
              /
         --- PublicationDate - 
       (null)/     \ 
        /      \ 
FirstPublicationDate -       --- PublicationDate 
         \ 
         \ 
         --- FirstPublicationDate 

Понятно, что IIF заявления хочет вернуть FirstPublicationDate, если это не нуль; затем PublicationDate и, наконец, GETDATE(). Вы можете сократить его до одного, гораздо более читабельный COALESCE заявление:

SELECT COALESCE(FirstPublicationDate, PublicationDate, GETDATE())        
0

То же IIF можно записать с вложенным заявлением СЛУЧАЯ как:

SELECT CASE WHEN [FirstPublicationDate] IS NULL THEN 
     CASE WHEN [PublicationDate] IS NULL THEN GETDATE() ELSE [PublicationDate] END 
     ELSE [FirstPublicationDate] END 
+0

ОП попросил объяснения о том, как это работает. Не просто конвертировать его код – litelite

+0

Спасибо, я думаю, что понимаю сейчас. Вложенный CASE имеет смысл. Кроме того, обратите внимание, что в примере я думаю, что закрытие END отсутствует. Спасибо. –

+0

@erasmocarlos: Да, я исправил 'END' – Arulkumar

0

Это не вложенный эквивалент вашего КИРПА, более redable

SELECT CASE 
    WHEN FirstPublicationDate IS NOT NULL THEN FirstPublicationDate 
    WHEN PublicationDate  IS NOT NULL THEN PublicationDate 
    ELSE GETDATE() 
END 

Но даже на большинстве SQLs у вас есть для этого случая мощный и самый простой вариант:

SELECT COALESCE(FirstPublicationDate, PublicationDate, GETDATE()) 

Вы можете прочитать о coalesce here, включает в себя сравнение с case

Смежные вопросы