J'ai développé une requête et dans les résultats des trois premières colonnes que j'obtiens NULL
. Comment puis-je le remplacer par 0
?
Select c.rundate,
sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled,
count(*) as Totalrun from
( Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
---cast(run_date as datetime)
cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/' +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock)
on a.job_id=b.job_id
where a.name='AI'
and b.step_id=0) as c
group by
c.rundate
sql
sql-server
Bhaskar Mishra
la source
la source
Réponses:
Lorsque vous souhaitez remplacer éventuellement une
null
colonne par autre chose, utilisez IsNull .Cela mettra un 0 dans myColumn s'il est nul en premier lieu.
la source
Vous pouvez utiliser ces deux méthodes, mais il existe des différences:
Comparaison de COALESCE () et ISNULL ():
La fonction ISNULL et l'expression COALESCE ont un objectif similaire mais peuvent se comporter différemment.
Étant donné que ISNULL est une fonction, elle n'est évaluée qu'une seule fois. Comme décrit ci-dessus, les valeurs d'entrée de l'expression COALESCE peuvent être évaluées plusieurs fois.
La détermination du type de données de l'expression résultante est différente. ISNULL utilise le type de données du premier paramètre, COALESCE suit les règles d'expression CASE et renvoie le type de données de valeur avec la priorité la plus élevée.
La capacité NULL de l'expression de résultat est différente pour ISNULL et COALESCE. La valeur de retour ISNULL est toujours considérée comme NOT NULL (en supposant que la valeur de retour est non NULL) tandis que COALESCE avec des paramètres non NULL est considéré comme NULL. Ainsi, les expressions ISNULL (NULL, 1) et COALESCE (NULL, 1) bien qu'équivalentes ont des valeurs de nullabilité différentes. Cela fait une différence si vous utilisez ces expressions dans des colonnes calculées, créez des contraintes de clé ou rendez la valeur de retour d'une UDF scalaire déterministe afin qu'elle puisse être indexée comme indiqué dans l'exemple suivant.
- Cette instruction échoue car la clé PRIMAIRE ne peut pas accepter les valeurs NULL - et la possibilité de valeur NULL de l'expression COALESCE pour col2 - est évaluée à NULL.
- Cette instruction réussit car la possibilité de valeur NULL de la fonction - ISNULL est évaluée comme NOT NULL.
Les validations pour ISNULL et COALESCE sont également différentes. Par exemple, une valeur NULL pour ISNULL est convertie en int alors que pour COALESCE, vous devez fournir un type de données.
ISNULL ne prend que 2 paramètres alors que COALESCE prend un nombre variable de paramètres.
si vous avez besoin d'en savoir plus, voici le document complet de msdn.
la source
Avec
coalesce
:Bien que, lors de la sommation
when condition then 1
, vous puissiez tout aussi facilement passersum
àcount
- par exemple:(
Count(null)
renvoie 0, tandis quesum(null)
renvoie null.)la source
Quand vous dites les trois premières colonnes, voulez-vous dire vos
SUM
colonnes? Si tel est le cas, ajoutezELSE 0
à vosCASE
déclarations. LeSUM
d'uneNULL
valeur estNULL
.la source
Un moyen simple est
la source
Enveloppez votre colonne dans ce code.
Vérifiez peut-être pourquoi vous obtenez des valeurs nulles
la source
Utilisez
COALESCE
, qui renvoie la première valeur non nulle, par exempleDéfinira Réussite à 0 s'il est renvoyé sous la forme
NULL
.la source
Ajoutez un else à vos instructions case afin qu'elles soient par défaut à zéro si la condition de test n'est pas trouvée. Pour le moment, si la condition de test n'est pas trouvée, NULL est passé à la fonction SUM ().
la source
Si vous utilisez Presto, AWS Athena, etc., il n'y a pas de fonction ISNULL (). À la place, utilisez:
la source
le problème ici est que sans l'instruction else, vous êtes tenu de recevoir un Null lorsque l'état d'exécution n'est pas l'état indiqué dans la description de la colonne. Ajouter quelque chose à Null entraînera Null, et c'est le problème avec cette requête.
Bonne chance!
la source
en suivant les réponses précédentes, je perdais le nom de ma colonne dans la base de données du serveur SQL, mais cette syntaxe m'a aidé à conserver également le nom de colonne
la source