Remplacement de NULL par 0 dans une requête de serveur SQL


176

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

@ user2246674 Les trois premières colonnes: sum (cas quand c.runstatus = 'Réussi' puis 1 fin) comme Succès, sum (cas quand c.runstatus = 'Échec' puis 1 fin) comme Échec, somme (cas quand c.runstatus = 'Annulé' puis 1 fin) comme Annulé
Bhaskar Mishra

Sparky, Oracle n'est pas différent d'utiliser NVL ou NVL2 ... vérifiez oracle-base.com/articles/misc/null-related-functions
KingRider

Réponses:


377

Lorsque vous souhaitez remplacer éventuellement une nullcolonne par autre chose, utilisez IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

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


2
Pour ceux qui utilisent SQL Server 2000 ou 2005, ISNULL est SQL Server 2008 et supérieur.
Kyle

1
pour plusieurs colonnes, dois-je écrire ISNULL plusieurs fois ou y a-t-il quelque chose comme ISNULL (myColumns, 0)?
Flaudre

@Kyle: C'est incorrect: d'après mon expérience personnelle (et une citation de livre ), je peux confirmer qu'ISNULL est pris en charge depuis (au moins) SQL Server 2000, probablement même plus tôt.
Heinzi

@Flaudre: Vous devez écrire ISNULL plusieurs fois, car chaque colonne de sortie doit avoir sa propre expression.
Heinzi

Cela m'aide également à obtenir le résultat précis dans SQL Server 2016. Merci beaucoup, vous venez de faire ma journée @phadaphunk
PatsonLeaner

83

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

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

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

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

- Cette instruction réussit car la possibilité de valeur NULL de la fonction - ISNULL est évaluée comme 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 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.


23

Avec coalesce:

coalesce(column_name,0)

Bien que, lors de la sommation when condition then 1, vous puissiez tout aussi facilement passer sumà count- par exemple:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

( Count(null)renvoie 0, tandis que sum(null)renvoie null.)


10

Quand vous dites les trois premières colonnes, voulez-vous dire vos SUMcolonnes? Si tel est le cas, ajoutez ELSE 0à vos CASEdéclarations. Le SUMd'une NULLvaleur 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, 

8

Un moyen simple est

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

7

Enveloppez votre colonne dans ce code.

 ISNULL(Yourcolumn, 0)

Vérifiez peut-être pourquoi vous obtenez des valeurs nulles


6

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 Réussite à 0 s'il est renvoyé sous la forme NULL.


1

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

  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

Si vous utilisez Presto, AWS Athena, etc., il n'y a pas de fonction ISNULL (). À la place, utilisez:

SELECT COALESCE(myColumn, 0 ) FROM myTable

0
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 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!


0

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

ISNULL(MyColumnName, 0) MyColumnName
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.