Вопрос:

Отображение X, когда Y равно нулю, а Z равно нулю

sql database relational-database

65 просмотра

3 ответа

1 Репутация автора

Я хотел бы отображать определенные даты, если другие возвращаются как нулевые ... Что я пробовал

case 
   when attv4.valueDateTime IS NOT NULL then attv4.valueDateTime
   when attv4.valueDateTime IS NULL then attv5.valueDateTime
   when (attv5.valueDateTime IS NULL AND attv4.valueDateTime IS NULL) then bpc.consentDate
   when (bpc.consentDate IS NULL AND attv4.valueDateTime IS NULL AND attv5.valueDateTime IS NULL) then col.collectDate 
end

Я также пытался использовать несколько ISNULL, но когда я это делаю, я получаю несколько записей для одного и того же человека, отображая различные даты, которые не были нулевыми.

Автор: Dalton.Wilson Источник Размещён: 22.08.2016 09:46

Ответы (3)


0 плюса

963 Репутация автора

Вы можете связать isnullзвонки так:

isnull(attv4.valueDateTime, 
       isnull(attv5.valueDateTime, 
              isnull(bpc.consentDate, col.collectDate)))
Автор: rohitvats Размещён: 22.08.2016 09:54

1 плюс

97663 Репутация автора

Мне нравится coalesce()за это. Он точно отражает то, что вам нужно: первое ненулевое значение в упорядоченном по приоритету списке значений.

Однако если вы хотите сделать это с помощью CASEвыражения, как вы пытались это сделать, то это будет выглядеть так:

case 
  when attv4.valueDateTime IS NOT NULL then attv4.valueDateTime
  when attv5.valueDateTime IS NOT NULL then attv5.valueDateTime
  when bpc.consentDate     IS NOT NULL then bpc.consentDate
  else col.collectDate 
end

Обратите внимание, в частности, что каждое последующее whenусловие считается, только если все предыдущие оцениваются как ложные; вам не нужно повторять негативы всех этих условий в каждом последующем предикате.

Автор: John Bollinger Размещён: 22.08.2016 10:02

0 плюса

10904 Репутация автора

sgeddes подчеркивает, что COALESCE () https://msdn.microsoft.com/en-us/library/ms190349.aspx может быть здесь полезен, и вам вообще не понадобится ваше заявление case.

COALESCE(attv4.valueDateTime, attv5.ValueDateTime, bpc.consentDate, col.collectdate)

Таким образом, в операторе case возвращается первый TRUE оператор . Таким образом, вы можете написать следующее утверждение, которое будет автоматически принимать во внимание значение 1, равное нулю, затем следующее и т. Д.

CASE
   WHEN attv4.ValueDateTime IS NOT NULL THEN attv4.ValueDateTime
   WHEN attv5.ValueDateTime IS NOT NULL THEN attv4.ValueDateTime
   WHEN bpc.ConsentDate IS NOT NULL THEN bpc.ConsentDate
   ELSE col.collectDate
END

Как указал @dnoeth, и я думаю, что мы все слишком быстро прочитали прошлое, было то, что ваши первые 2 условия всегда будут выполнены, так как attv4.ValueDateTime имеет значение NULL или NOT NULL. Если NOT NULL, вы получите значение attv4.ValueDateTime, а если NULL, вы получите attv5.valueDateTime, но вы никогда не получите bpc.consentDate или col.collectDate .....

Однако, если вы получаете несколько записей на человека, это, скорее всего, связано с СОЕДИНЕНИЕМ, а не с кейсом . Вы можете посмотреть на вызов DISTINCT и исключить неиспользуемые столбцы, или использовать ROW_NUMBER () и выбрать результаты, где = 1.

Автор: Matt Размещён: 22.08.2016 10:05
Вопросы из категории :
32x32