在存储过程(在我的情况下为Oracle)中,我想向现有记录添加一些值。问题是现有值和要添加的值都可以为空。我只希望当两个操作数都为null时结果为NULL。如果只有其中一个为null,我希望结果是另一个操作数。如果两者都是非null,我希望结果是“正常”添加。
这是我到目前为止所使用的内容:
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>;
是否有更优雅的方式(最好是完全在SQL中,即只是在一个更新语句中,而不是长CASE-Statement,其逻辑与上面的代码基本相同)?
答案 0 :(得分:52)
如果你想添加a和b并且其中一个可能为null,你可以使用coalesce,它返回你传递的第一个非null参数:
coalesce(a+b, a, b)
所以在这种情况下,如果两个参数都不为null,它将返回总和。如果只有b为空,它将跳过a + b并返回a。如果a为null,它将跳过a + b和a并返回b,如果它们都为null,则只返回null。
如果你希望答案为0而不是null如果a和b都为null,你可以传递0作为最后一个参数:
coalesce(a+b, a, b, 0)
请注意@erwins answer - null
可能不适合使用。
答案 1 :(得分:9)
我用这种方式完成了它:
coalesce("Column1",0.00) + coalesce("Column2",0.00)
我正在使用前端高级管理员....他们不明白为什么NULL和0不会以同样的方式处理。
在我的情况下,它可以工作,只需用0.00替换NULL ...但可能不是全部:)
答案 2 :(得分:7)
在SQL中,Null应该是一个说“我不知道”的状态。
如果你不知道b是多少,那么你也不知道a + b是多少,并且在这种情况下假装a + b = a是误导。
答案 3 :(得分:5)
你也可以使用ISNULL,所以如果你有3个值
isnull(val1,0)+isnull(val2,0)+isnull(val3,0)
哪个列将具有NULL将使用0,否则使用其原始值。
答案 4 :(得分:0)
在SQL术语中,当添加数字时,结果为NULL表示未添加任何非空数字。
这表明用SQL术语得出的明智答案是
如果A为NULL而B为NULL则为NULL ELSE ISNULL(A,0)+ ISNULL(B,0)结束