Remplacer NULL par 0 dans une requête SQL server
J'ai développé une requête, et dans les résultats pour les trois premières colonnes je reçois 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
9 réponses
Lorsque vous voulez remplacer une colonne éventuellement null
par autre chose, utilisez IsNull .
SELECT ISNULL(myColumn, 0 ) FROM myTable
Cela mettra un 0 dans myColumn s'il est null en premier lieu.
Vous pouvez utiliser ces deux méthodes, mais il y a des différences:
SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1
Comparaison de COALESCE () et ISNULL():
La fonction ISNULL et l'expression COALESCE ont une mais peut se comporter différemment.
Comme ISNULL est une fonction, elle n'est évaluée qu'une seule fois. Comme décrit ci-dessus, les valeurs d'entrée pour l'expression COALESCE peuvent être évalué plusieurs fois.
Détermination du type de données résultant l'expression est différente. ISNULL utilise le type de données du premier paramètre, COALESCE suit l'expression de casse règle et renvoie le type de données de valeur avec la priorité la plus élevée.
La nullité de l'expression de résultat est différente pour ISNULL et FUSIONNENT. La valeur de retour ISNULL est toujours considérée comme non NULLable (en supposant que la valeur de retour est non nullable) alors que COALESCE avec des paramètres non null est considéré comme NULL. De sorte que le expressions ISNULL (NULL, 1) et COALESCE (NULL, 1) bien que equivalent ont des valeurs de nullabilité différentes. Ce qui fait un différence si vous utilisez ces expressions dans des colonnes calculées, création de contraintes clés ou création de la valeur de retour d'un UDF scalaire déterministe afin qu'il puisse être indexé comme indiqué dans ce qui suit exemple.
-- cette instruction échoue car la clé primaire ne peut pas accepter les valeurs NULL -- et la nullité de l'expression de coalescence pour col2 -- évalue à NULL.
CREATE TABLE #Demo
(
col1 integer NULL,
col2 AS COALESCE(col1, 0) PRIMARY KEY,
col3 AS ISNULL(col1, 0)
);
-- Cette déclaration réussit parce que la nullité du -- La fonction ISNULL évalue comme non NULL.
CREATE TABLE #Demo
(
col1 integer NULL,
col2 AS COALESCE(col1, 0),
col3 AS ISNULL(col1, 0) PRIMARY KEY
);
Les Validations pour ISNULL et COALESCE sont également différentes. 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 une variable le nombre de paramètres.
Si vous avez besoin d'en savoir plus voici le document complet de msdn.
Avec coalesce
:
coalesce(column_name,0)
Bien que, lorsque vous additionnez when condition then 1
, vous pouvez tout aussi facilement changer sum
en count
- par exemple:
count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,
(Count(null)
renvoie 0, tandis que sum(null)
renvoie null.)
Quand vous dites les trois premières colonnes, voulez-vous dire vos SUM
colonnes? Si c'est le cas, ajoutez ELSE 0
à vos instructions CASE
. Le SUM
de NULL
valeur est NULL
.
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled,
Enveloppez votre colonne dans ce code.
ISNULL(Yourcolumn, 0)
Peut-être vérifier pourquoi vous obtenez nulls
Utilisez COALESCE
, qui renvoie la première valeur not-null par exemple
SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded
Définira réussi comme 0 s'il est retourné comme NULL
.
Un moyen Simple est
UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
Ajoutez un autre à 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 ().
Select c.rundate,
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 else 0 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
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled,
Le problème ici est que sans l'instruction else, vous êtes obligé de recevoir une valeur Null lorsque le statut d'exécution n'est pas le statut 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!