web-dev-qa-db-fra.com

Instruction de cas SQL Server lorsque IS NULL

J'essaie de faire une fonction de type instruction IF dans le serveur SQL.

Là où il y a un NULL dans le champ, je veux qu'il prenne un champ de l'une des tables et lui ajoute 10 jours.

Et si possible, créez une autre colonne et ajoutez les 30 jours.

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

Le résultat ressemblerait un peu à:

    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
52
caffaddt
CASE WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)   -- Type DATETIME
     ELSE '-'                                         -- Type VARCHAR
     END AS [DATE]

Vous devez sélectionner l'un ou l'autre type pour le champ, le type de champ ne peut pas varier par ligne. Le plus simple consiste à supprimer le ELSE '-' et à le laisser implicitement obtenir la valeur NULL à la place pour le second cas.

70
Joachim Isaksson

Je suis d'accord avec Joachim pour remplacer le trait d'union par NULL. Mais si vous voulez vraiment un trait d'union, convertissez la date en chaîne:

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

De plus, la distinct n'est pas nécessaire dans votre instruction select. Le group by le fait déjà pour vous.

13
Gordon Linoff

Vous pouvez utiliser IIF (je pense de SQL Server 2012)

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

vous pouvez ajouter une autre déclaration si vous souhaitez ajouter 30 jours à la même chose.

4
Mahesh Sambu

Dans cette situation, vous pouvez utiliser la fonction ISNULL () au lieu de l'expression CASE

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
3
Abdullah Zaid

Votre trait d'union dans votre instruction ELSE n'est pas accepté dans la colonne en cours de définition sous le type de données datetime. Vous pouvez soit:

a) Enroulez un CAST autour de votre champ [stat] pour le convertir en une représentation varchar d’une date

b) Utilisez une date/heure telle que 9999-12-31 pour votre valeur ELSE.

1
user2620038

Jetez un coup d'œil à la fonction ISNULL. Cela vous aide à remplacer les valeurs NULL par d'autres valeurs. http://msdn.Microsoft.com/en-us/library/ms184325.aspx

0
Kees de Wit