2013-07-25 12 views
35

Sto tentando di eseguire una funzione di tipo di istruzione IF nel server SQL.Dichiarazione caso SQL Server quando IS NULL

Dove c'è un NULL nel campo, voglio che prenda un campo da una delle tabelle e aggiunga 10 giorni ad esso.

E se possibile, creare un'altra colonna e aggiungere i 30 giorni.

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 

Il risultato apparirebbe un po 'come:

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 
+1

Cosa c'è di sbagliato con l'uscita si' stai ottenendo ora? –

+0

Msg 242, livello 16, stato 3, riga 1 La conversione di un tipo di dati varchar in un tipo di dati datetime ha provocato un valore fuori intervallo. – caffaddt

+0

IsNull potrebbe aiutare. http://msdn.microsoft.com/en-us/library/ms184325.aspx – Oliver

risposta

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

è necessario selezionare un tipo o l'altro per il campo, il tipo di campo non può variare per riga. Il più semplice è quello di rimuovere il ELSE '-' e lasciare implicitamente il valore NULL invece per il secondo caso.

+0

Grazie, ci proverò domani. – caffaddt

+0

Ho provato questo e la query viene eseguita ma restituisce un valore NULL invece di un valore [EVENT DATE] +10 sui campi [STAT] che sono NULL – caffaddt

+0

@caffaddt Potresti configurare un SQLfiddle con alcuni dati di esempio? Ho solo risolto la sintassi della tua query, non riesco a vedere la logica nel risultato desiderato senza vedere alcuni dati di input. –

1

Il trattino nella dichiarazione ELSE non è accettato nella colonna che viene definita nel tipo di dati datetime. Si potrebbe o:

a) Avvolgere un CAST attorno al [stat] campo per convertirlo in una rappresentazione varchar di una data

b) Utilizzare un datetime come 9999-12-31 per il valore ELSE.

4
case isnull(B.[stat],0) 
    when 0 then dateadd(dd,10,(c.[Eventdate])) 
    end 

è possibile aggiungere un'altra istruzione se si desidera aggiungere 30 giorni allo stesso.

+0

Ho provato questo e ho ricevuto questo messaggio: Msg 245, livello 16, stato 1, riga 1 Conversione non riuscita durante la conversione del valore varchar 'STAT' nel tipo di dati int. – caffaddt

+0

si prova la funzione di trasmissione o conversione per modificare il tipo di dati da confrontare. –

9

Sono d'accordo con Joachim che è necessario sostituire il trattino con NULL. Ma, se davvero si vuole un trattino, convertire la data in una stringa:

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

Inoltre, il distinct è inutile nella vostra select dichiarazione. Lo group by lo fa già per te.

+0

Viene eseguito ma non restituisce un valore per DATE, ma restituisce tutto come null. – caffaddt

1

In questa situazione è possibile utilizzare ISNULL() funzione invece di espressione CASE

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE] 
2

È possibile utilizzare IIF (credo da SQL Server 2012)

SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]