添加NULL值

Tho*_*ten 25 sql null

在存储过程(在我的情况下为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>;
Run Code Online (Sandbox Code Playgroud)

是否有一种更优雅的方式(最好是完全在SQL中,即只是在一个更新语句中,缺少长CASE-Statement,其逻辑与上面的代码基本相同)?

rjm*_*nro 58

如果要添加a和b并且其中一个可能为null,则可以使用coalesce,它返回传递它的第一个非null参数:

coalesce(a+b, a, b)
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,如果两个参数都不为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)
Run Code Online (Sandbox Code Playgroud)

请考虑@erwins的回答 - null可能不适合使用.


小智 10

我这样做了:

coalesce("Column1",0.00) + coalesce("Column2",0.00)
Run Code Online (Sandbox Code Playgroud)

我正在使用前端高级管理员......他们不明白为什么NULL和0不会以同样的方式处理.

在我的情况下,它的工作原理,只是用0.00替换NULL ...可能不是全部:)

  • 如果两个值都为null,则此答案将返回0.我的回答将返回null.根据你正在做的事情,这可能是更可取的(或者可能不是 - 这是一个很好的答案). (5认同)

Erw*_*out 8

在SQL中,Null应该是一个说"我不知道"的状态.

如果你不知道b是多少,那么你也不知道a + b是多少,并且在这种情况下假装a + b = a是误导性的.

  • 那么,我们可以进入关于NULL的不知道,不适用等的争论.在我的例子中,NULL最好对应于n/a ..所以如果我有一个非NULL值和一个NULL,那么使用值是公平的..它最好地映射到我正在建模的东西. (2认同)
  • SQL 中 Null 的含义并不重要,重要的是 Null 在代码或报告中的含义。 (2认同)

use*_*028 6

您也可以使用ISNULL,因此如果您有3个值

isnull(val1,0)+isnull(val2,0)+isnull(val3,0)
Run Code Online (Sandbox Code Playgroud)

哪个列将具有NULL将使用0,否则使用其原始值.

  • 由于原始答案没有指定任何 SQL 引擎:`ISNULL()` 适用于 SQL 服务器,`IFNULL()` 适用于 MySQL,`NVL()` 适用于 Oracle。详情见 https://www.w3schools.com/sql/sql_isnull.asp (4认同)
  • 这是最好的答案,因为可以在任何情况下使用。`COALESCE()` 选项对 A+B 很有用。但是如果你想要 A+B+C+D+... 尝试使用它是没有意义的。`ISNULL()` 始终有效。 (2认同)