我想将两个数字加在一起,但当其中一个数字为null时,结果为null。有没有解决的办法。我可以简单地在代码中执行它,但我宁愿在查询中完成它。这是一个oracle数据库。
表格结构
hours_t
type craft regular overtime
A 1 5 0
A 1 3 1
B 2 9 <null>
B 1 4 4
查询
select type, craft, sum(regular + overtime) as total_hours
from hours_t
group by type, craft
order by type, craft
不受欢迎的结果
type craft total_hours
A 1 9
B 1 8
B 2 <null>
想要的结果
type craft total_hours
A 1 9
B 1 8
B 2 9
答案 0 :(得分:49)
NVL(值,默认值)是您要查找的功能。
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有5个与NULL相关的函数:
NVL:
NVL(expr1, expr2)
NVL允许您使用查询结果中的字符串替换null(作为空白返回)。如果expr1为null,则NVL返回expr2。如果expr1不为null,则NVL返回expr1。
NVL2:
NVL2(expr1, expr2, expr3)
NVL2允许您根据指定的表达式是null还是非null来确定查询返回的值。如果expr1不为null,则NVL2返回expr2。如果expr1为null,则NVL2返回expr3。
COALESCE(expr1, expr2, ...)
COALESCE返回表达式列表中的第一个非空expr。至少有一个expr不能是文字NULL。如果所有出现的expr都计算为null,则该函数返回null。
NULLIF(expr1, expr2)
NULLIF比较expr1和expr2。如果它们相等,则该函数返回null。如果它们不相等,则函数返回expr1。您不能为expr1指定文字NULL。
LNNVL(condition)
的更多信息LNNVL提供了一种简明的方法来评估条件的一个或两个操作数可能为空时的条件。
答案 1 :(得分:47)
select type, craft, sum(nvl(regular,0) + nvl(overtime,0)) as total_hours
from hours_t
group by type, craft
order by type, craft
答案 2 :(得分:9)
关于使用nvl()的其他答案是正确的,但似乎没有一个解决更突出的问题:
你是否应该在这个专栏中有NULL?
它们是否具有0以外的含义?
这似乎是一个你应该在ecolumn上有一个NOT NULL DEFAULT 0的情况
答案 3 :(得分:4)
NVL的最高评价答案完全有效。如果您对使SQL代码更具可移植性感兴趣,可能需要使用CASE,它在Oracle和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
答案 4 :(得分:1)
您需要使用NVL功能,例如
SUM(NVL(常规,0)+ NVL(超时,0))
答案 5 :(得分:0)
select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0)) as total_hours
from hours_t
group by type, craft
order by type, craft
答案 6 :(得分:0)
代码:
select type, craft, sum(coalesce( regular + overtime, regular, overtime)) as total_hours
from hours_t
group by type, craft
order by type, craft
答案 7 :(得分:0)
在某些情况下,还需要nvl(sum(column_name),0)。您可能想要考虑您的方案。
例如, 我试图根据特定条件从特定表中获取特定列的总和。根据条件,
如果你在这里使用sum(nvl(column_name,0)),它会给你null。 你可能想要的是nvl(sum(column_name),0)。
这可能是必需的,尤其是当您将此结果传递给java时,数据类型为数字,因为这样就不需要特殊的空值处理。
答案 8 :(得分:0)
如果没有SUM(NVL(regular, 0) + NVL(overtime, 0))
的分组,则会引发错误,为避免这种情况,我们可以简单地使用NVL(regular, 0) + NVL(overtime, 0)