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
118
demandé sur alex 2013-05-30 19:47:01

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.

277
répondu phadaphunk 2013-05-30 15:49:21

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():

  1. La fonction ISNULL et l'expression COALESCE ont une mais peut se comporter différemment.

  2. 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.

  3. 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.

  4. 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 
);
  1. 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.

  2. 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.

59
répondu Mojtaba Rezaeian 2014-11-14 06:42:32

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.)

20
répondu Josef K 2013-05-30 15:54:52

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, 
9
répondu sgeddes 2013-05-30 15:49:44

Enveloppez votre colonne dans ce code.

 ISNULL(Yourcolumn, 0)

Peut-être vérifier pourquoi vous obtenez nulls

6
répondu Bobby 2013-05-30 15:50:14

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.

5
répondu dKen 2013-05-30 15:49:50

Un moyen Simple est

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
3
répondu Umang Patwa 2016-07-02 10:52:15

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
1
répondu Bad Wolf 2013-05-30 15:50:29
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!

0
répondu Krishna Chavali 2016-09-23 14:08:41