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
select type, craft, sum(nvl(regular,0) + nvl(overtime,0)) as total_hours
from hours_t
group by type, craft
order by type, craft
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:
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(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(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(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
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
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
Vous devez utiliser la fonction NVL, par exemple.
SUM (NVL (normal, 0) + NVL (heures supplémentaires, 0))
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,
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.
Code:
select type, craft, sum(coalesce( regular + overtime, regular, overtime)) as total_hours
from hours_t
group by type, craft
order by type, craft
select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0)) as total_hours
from hours_t
group by type, craft
order by type, craft