SQL Server Cas d'une Déclaration de valeur EST NULL
Je suis en train de faire une déclaration de type de fonction dans SQL server.
Où il y a une valeur NULL dans le champ, j'ai envie de prendre un domaine à partir de l'une des tables et ajouter 10 jours pour elle.
Et, si possible, de créer une autre colonne et ajouter 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 ressemble en quelque sorte à:
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
- Quel est le problème avec la sortie que vous êtes maintenant?
- Msg 242, Niveau 16, État 3, Ligne 1 La conversion d'un type de données varchar à un type de données datetime entraîné dans une gamme de valeur.
- IsNull pourrait aider. msdn.microsoft.com/en-us/library/ms184325.aspx
- Je l'ai changé pour ISNULL et l'erreur est maintenant: Msg 4145, Niveau 15, État 1, Ligne 10, Une expression de la non-booléenne de type spécifié dans un contexte où une condition est prévu, près de "ISNULL'.
Vous devez vous connecter pour publier un commentaire.
Vous devez sélectionner un type ou de l'autre du champ, le type de champ peut pas varier par ligne.
Le plus simple est de supprimer le
ELSE '-'
et laisser implicitement obtenir la valeurNULL
plutôt pour la deuxième hypothèse.#TEMP1 A FULL OUTER JOIN #TEMP2 B ON A.[ID]=B.[ID] FULL OUTER JOIN #TEMP3 C ON A.[ID]=C.[ID] OR B.[ID]=C.[ID]
vérifiez Également que vous disposez d'une ligne dans le B qui aSTAT IS NULL
qui a une ligne dansC
avec la mêmeID
et un non-nulle deEVENT DATE
.Je suis d'accord avec Joachim que vous devez remplacer le trait d'union avec
NULL
. Mais, si vraiment vous voulez un trait d'union, convertir la date en une chaîne:Aussi, le
distinct
est inutile dans votreselect
déclaration. Legroup by
déjà fait cela pour vous.Vous pouvez utiliser
IIF
(je pense à partir de SQL Server 2012)vous pouvez ajouter dans le else si vous souhaitez ajouter les 30 jours à la même .
Dans cette situation, vous pouvez utiliser la fonction ISNULL() au lieu de l'expression case
Votre trait d'union dans votre ELSE n'est pas accepté dans la colonne qui est en train d'être définies, selon le type de données datetime. Vous pouvez soit:
a) l'Envelopper d'un plâtre autour de votre [stat] champ pour le convertir en un varchar représentation d'une date
b) l'Utilisation d'un datetime comme 9999-12-31 pour votre AUTRE valeur.
Prendre un coup d'oeil à la fonction ISNULL. Il vous permet de remplacer les valeurs NULL pour les autres valeurs. http://msdn.microsoft.com/en-us/library/ms184325.aspx