web-dev-qa-db-fra.com

Remplacement de NULL par dans une requête SQL Server

J'ai développé une requête, et dans les résultats des 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
132
Bhaskar Mishra

Lorsque vous souhaitez remplacer une colonne null éventuelle par autre chose, utilisez IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Cela mettra un 0 dans myColumn s'il est nul en premier lieu.

314
phadaphunk

Vous pouvez utiliser ces deux méthodes, mais il existe 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 un objectif similaire, mais peuvent se comporter différemment.

  2. Comme ISNULL est une fonction, elle n’est évaluée qu’une fois. Comme Décrit ci-dessus, les valeurs d'entrée pour l'expression COALESCE peuvent être Évaluées plusieurs fois.

  3. 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 de l'expression CASE et renvoie le type de données de la valeur avec La priorité la plus élevée.

  4. La valeur NULLability 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 NULLable (En supposant que la valeur de retour est non nullable) alors que COALESCE Avec des paramètres non NULL est considérée comme NULL. Ainsi, les expressions ISNULL (NULL, 1) et COALESCE (NULL, 1) bien que Équivalent aient des valeurs de nullabilité différentes. Cela fait une différence Si vous utilisez ces expressions dans des colonnes calculées, En créant des contraintes de clé ou en rendant la valeur de retour d'une UDF scalaire Déterministe afin qu'elle puisse être indexée comme indiqué ci-dessous Exemple.

- Cette instruction échoue parce que PRIMARY KEY ne peut pas accepter les valeurs NULL -- et que l'expression COALESCE pour la col2 -- a la valeur NULL et qu'elle a pour valeur NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0) PRIMARY KEY, 
    col3 AS ISNULL(col1, 0) 
); 

- Cette instruction aboutit car la nullité de la fonction -- ISNULL est évaluée comme NOT NOT 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. Par exemple, Une valeur NULL pour ISNULL est convertie en int alors que pour COALESCE, , Vous devez fournir un type de données.

  2. ISNULL prend seulement 2 paramètres alors que COALESCE prend un nombre de paramètres variable

    si vous voulez en savoir plus voici le document complet de msdn.

67
Mojtaba Rezaeian

Avec coalesce:

coalesce(column_name,0)

Cependant, en sommant 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, alors que sum(null) renvoie null.)

20
user359040

Lorsque vous dites les trois premières colonnes, voulez-vous dire vos colonnes SUM? Si tel est le cas, ajoutez ELSE 0 à vos instructions CASE. La SUM d'une valeur NULL 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
sgeddes

Enveloppez votre colonne dans ce code.

 ISNULL(Yourcolumn, 0)

Peut-être vérifier pourquoi vous obtenez des NULL

6
Bobby

Utilisez COALESCE, qui renvoie la première valeur non nulle, par exemple.

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

Définira Succeeded à 0 s'il est retourné sous la forme NULL.

5
dKen

Un moyen simple est

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
5
Umang Patwa

Ajoutez un autre élément à vos déclarations de cas afin qu'elles par défaut à zéro si la condition de test n'est pas trouvée. Pour l'instant, si la condition de test n'est pas trouvée, NULL est transmis à 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
Bad Wolf
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 tenu de recevoir une valeur Null lorsque le statut d'exécution n'est pas celui indiqué dans la description de la colonne. Ajouter quoi que ce soit à Null aura pour résultat Null, et c'est le problème de cette requête.

Bonne chance!

0
Krishna Chavali

en suivant les réponses précédentes, je perdais mon nom de colonne dans la base de données SQL Server. Cependant, cette syntaxe m'a permis de conserver également ColumnName.

ISNULL(MyColumnName, 0) MyColumnName
0
Chameleon