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
Bhaskar Mishra
la source
@ 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.

phadaphunk
la source
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.

Mojtaba Rezaeian
la source
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.)


la source
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, 
sgeddes
la source
8

Un moyen simple est

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
Umang Patwa
la source
7

Enveloppez votre colonne dans ce code.

 ISNULL(Yourcolumn, 0)

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

Policier
la source
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.

dKen
la source
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
Méchant loup
la source
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
Gaz_Edge
la source
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!

Krishna Chavali
la source
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
Caméléon
la source