web-dev-qa-db-fra.com

Somme des colonnes avec des valeurs nulles dans Oracle

Je veux ajouter deux nombres ensemble, mais lorsqu'un de ces nombres est nul, le résultat est nul. Y a-t-il un moyen de contourner ceci. Je pourrais simplement le faire dans le code mais je préférerais le faire dans la requête. Ceci est une base de données Oracle.

La structure de la table

hours_t
type     craft    regular       overtime
 A         1        5              0
 A         1        3              1
 B         2        9            <null>
 B         1        4              4

La requête

select type, craft, sum(regular + overtime) as total_hours
from hours_t
group by type, craft
order by type, craft

Les résultats indésirables

type   craft   total_hours
  A      1          9
  B      1          8
  B      2        <null>

Les résultats souhaités

type    craft   total_hours
  A       1          9
  B       1          8
  B       2          9
25
Berek Bryan
select type, craft, sum(nvl(regular,0) + nvl(overtime,0)) as total_hours
from hours_t
group by type, craft
order by type, craft
47
Tony Andrews

NVL (valeur, valeur par défaut) est la fonction que vous recherchez.

select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0) ) as total_hours
from hours_t
group by type, craft
order by type, craft

Oracle possède 5 fonctions liées à NULL:

  1. NVL 
  2. NVL2
  3. SE FONDRE
  4. NULLIF
  5. LNNVL

NVL

NVL(expr1, expr2)

NVL vous permet de remplacer null (renvoyé sous forme de blanc) par une chaîne dans les résultats d'une requête. Si expr1 est null, alors NVL renvoie expr2. Si expr1 n'est pas null, NVL renvoie expr1.

NVL2

NVL2(expr1, expr2, expr3)

NVL2 vous permet de déterminer la valeur renvoyée par une requête en fonction du caractère null ou non de l'expression spécifiée. Si expr1 n'est pas null, NVL2 renvoie expr2. Si expr1 est null, NVL2 renvoie expr3.

COALESCE

COALESCE(expr1, expr2, ...)

COALESCE renvoie la première expression non nulle de la liste des expressions. Au moins un expr ne doit pas être le NULL littéral. Si toutes les occurrences de expr sont évaluées à null, la fonction renvoie null.

NULLIF

NULLIF(expr1, expr2)

NULLIF compare expr1 et expr2. S'ils sont égaux, la fonction renvoie null. S'ils ne sont pas égaux, alors la fonction retourne expr1. Vous ne pouvez pas spécifier le NULL littéral pour expr1.

LNNVL

LNNVL(condition)

LNNVL fournit un moyen concis d'évaluer une condition lorsqu'un ou les deux opérandes de la condition peuvent être nuls. 

Plus d'infos sur Oracle SQL Functions

49
zendar

Les autres réponses concernant l'utilisation de nvl () sont correctes, mais aucune ne semble adresser un point plus important:

Si vous avez même des valeurs NULL dans cette colonne?

Ont-ils une signification autre que 0?

Cela ressemble à un cas où vous devriez avoir un NOT NULL DEFAULT 0 sur l’écolonne

9
cletus

La réponse la mieux notée avec NVL est totalement valide. Si vous souhaitez rendre votre code SQL plus portable, vous pouvez utiliser CASE, qui prend en charge la même syntaxe dans Oracle et SQL Server:

select 
  type,craft,
  SUM(
    case when regular is null
         then 0
         else regular
    end
    +
    case when overtime is null
         then 0
         else overtime
    end
  ) as total_hours
from 
  hours_t
group by
  type
 ,craft
order by
  type
 ,craft
4
JosephStyons

Vous devez utiliser la fonction NVL, par exemple.

SUM (NVL (normal, 0) + NVL (heures supplémentaires, 0))

1
Turnkey

Dans certains cas, nvl (sum (nom_colonne), 0) est également requis. Vous voudrez peut-être examiner vos scénarios.

Par exemple, J'essaie d'extraire la somme d'une colonne particulière d'une table particulière en fonction de certaines conditions. Basé sur les conditions,

  1. une ou plusieurs lignes existent dans la table. Dans ce cas, je veux la somme.
  2. les lignes n'existent pas. Dans ce cas, je veux 0.

Si vous utilisez sum (nvl (nom_colonne, 0)) ici, vous obtiendrez null . Ce que vous voudrez peut-être, c'est nvl (sum (nom_colonne), 0).

Cela peut être nécessaire, en particulier lorsque vous transmettez ce résultat à Java, par exemple, que le type de données est numérique car il n’exigera pas de traitement null spécial.

0
Nikhil

Code:

select type, craft, sum(coalesce( regular + overtime, regular, overtime)) as total_hours
from hours_t
group by type, craft
order by type, craft
0
Kumar SR
select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0)) as total_hours
from hours_t
group by type, craft
order by type, craft
0
Quassnoi