web-dev-qa-db-fra.com

Addition avec des valeurs NULL

Dans une procédure stockée (Oracle dans mon cas), je souhaite ajouter des valeurs à un enregistrement existant. Le problème est que la valeur existante et la valeur à ajouter peuvent être nulles. Je veux que le résultat soit NULL uniquement lorsque les deux opérandes sont nuls. Si un seul d'entre eux est nul, je veux que le résultat soit l'autre opérande. Si les deux ne sont pas nuls, je veux que le résultat soit une addition "normale".

Voici ce que j'utilise jusqu'à présent:

SELECT column INTO anz_old FROM aTable Where <someKeyCondition>;
IF anz_old IS NULL
THEN
    anz_new := panzahl;
ELSE
    anz_new := anz_new + NVL (panzahl, 0);
END IF;
UPATE aTabel set column = anz_new Where <someKeyCondition>;

Existe-t-il un moyen plus élégant (de préférence complètement en SQL, c'est-à-dire juste dans une instruction de mise à jour courte d'une longue instruction CASE avec fondamentalement la même logique que le code ci-dessus)?

25
Thorsten

Si vous souhaitez ajouter a et b et que l'un ou l'autre peut être nul, vous pouvez utiliser coalesce, qui renvoie le premier paramètre non nul que vous lui passez:

coalesce(a+b, a, b)

Donc, dans ce cas, si aucun des paramètres n'est nul, il renverra la somme. Si seulement b est nul, il sautera a + b et retournera a. Si a est nul, il sautera a + b et a et retournera b, qui ne sera nul que s'ils sont tous les deux nuls.

Si vous voulez que la réponse soit 0 plutôt que nulle si a et b sont nuls, vous pouvez passer 0 comme dernier paramètre:

coalesce(a+b, a, b, 0)

Considérez que @ erwins answer - null pourrait ne pas être la bonne chose à utiliser.

57
rjmunro

Je l'ai accompli de cette façon:

coalesce("Column1",0.00) + coalesce("Column2",0.00)

Je travaille avec des cadres de haut niveau front-end ... Ils ne comprennent pas pourquoi NULL et 0 ne sont pas traités de la même manière.

Dans mon cas, cela fonctionne, il suffit de remplacer NULL par 0,00 ... peut-être pas du tout :)

10
sean

En SQL, Null est censé être un état qui dit "Je ne sais pas".

Si vous ne savez pas combien vaut b, alors vous ne savez pas non plus combien vaut a + b, et il est trompeur de prétendre que a + b = a dans ce cas.

8
Erwin Smout

Vous pouvez également utiliser ISNULL, donc si vous avez 3 valeurs

isnull(val1,0)+isnull(val2,0)+isnull(val3,0)

chaque colonne aura un NULL utilisera un 0, sinon sa valeur d'origine.

5
user734028

En termes SQL, lors de l'ajout de nombres, le résultat NULL signifie qu'aucun nombre non nul n'a été ajouté.

Cela suggère qu'une réponse sensée en termes SQL serait

CASE WHEN A IS NULL AND B IS NULL THEN NULL ELSE ISNULL (A, 0) + ISNULL (B, 0) END

0
justasqluser