Instrução Do Caso Do Servidor SQL quando é nulo

estou a tentar fazer uma função de tipo de declaração IF no servidor SQL.

onde há um NULL no campo, eu quero que ele pegue um campo de uma das tabelas e adicione 10 dias a ele.

e se possível criar outra coluna e adicionar os 30 dias.

SELECT DISTINCT
    B.[ID],
    MAX(A.[START DATE]),
    B.[STAT],
    C.[POST DATE],
    CASE
          WHEN (C.[POST DATE] BETWEEN C.[EVENT DATE]+10 AND C.[EVENT DATE]+30) THEN 'GOOD'
          END AS [BETTER VISIT],
    CASE
          WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)
          ELSE '-'
          END AS [DATE]
FROM 
    #TEMP1 A
    FULL OUTER JOIN #TEMP2 B
    ON A.[ID]=B.[ID]
    FULL OUTER JOIN #TEMP3 C
    ON A.[ID]=C.[ID]
GROUP BY
    B.[ID],
    B.[STAT],
    C.[POST DATE],
    C.[EVENT DATE]
ORDER BY
    A.[START DATE] DESC

o resultado seria parecido com:

    ID  START DATE   STAT    POST DATE    BETTER VISIT    DATE         DATE2
    ---------------------------------------------------------------------------
    1   2013-01-01   GOOD    2013-11-01   GOOD            -            -
    2   2013-03-01   NULL    NULL         NULL            2013-03-11   2013-03-31
Author: caffaddt, 2013-07-26

7 answers

CASE WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)   -- Type DATETIME
     ELSE '-'                                         -- Type VARCHAR
     END AS [DATE]

Você precisa selecionar um tipo ou outro para o campo, o tipo de campo não pode variar por linha. O mais simples é remover o ELSE '-' e deixá-lo implicitamente obter o valor {[[2]} em vez do segundo caso.

 62
Author: Joachim Isaksson, 2013-07-25 21:44:48

Concordo com Joachim que você deve substituir o hífen por NULL. Mas, se você realmente quer um hífen, converta a data para um texto:

(CASE WHEN B.[STAT] IS NULL
      THEN convert(varchar(10), C.[EVENT DATE]+10, 121)
      ELSE '-'
 END) AS [DATE]

Também, o distinct é desnecessário na sua declaração select. O {[4] } Já Faz isto por ti.

 11
Author: Gordon Linoff, 2013-07-25 23:24:30

Você pode usar IIF (penso que a partir do SQL Server 2012)

SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]
 5
Author: Xin, 2017-03-15 08:43:51
  case isnull(B.[stat],0)
  when 0 then dateadd(dd,10,(c.[Eventdate]))
  end

Você pode adicionar em outra declaração se quiser adicionar 30 dias ao mesmo .

 4
Author: Mahesh Sambu, 2013-07-25 21:51:49

O seu hífen na sua declaração ELSE não é aceite na coluna que está a ser definida sob o tipo de dados datetime. Você poderia: [2]

A) enrole um molde em torno do seu campo [stat] para o converter para uma representação varchar de uma data

B) utilize um datetime como 9999-12-31 para o seu outro valor.

 1
Author: Deepraj Kunnath, 2013-07-26 02:20:17

Nesta situação, poderá usar a função ISNULL () em vez da expressão de maiúsculas

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
 1
Author: Abdullah Zaid, 2016-08-27 08:31:33

Olha para a função ISNULL. Ele ajuda você a substituir valores nulos para outros valores. http://msdn.microsoft.com/en-us/library/ms184325.aspx

 0
Author: Kees de Wit, 2013-07-25 21:44:38