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)?
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.
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 :)
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.
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.
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