在oracle中使用null值汇总列

时间:2009-02-26 13:30:51

标签: sql oracle

我想将两个数字加在一起,但当其中一个数字为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

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相关的函数:

  1. NVL
  2. NVL2
  3. COALESCE
  4. NULLIF
  5. LNNVL
  6. 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

    COALESCE(expr1, expr2, ...)
    
      

    COALESCE返回表达式列表中的第一个非空expr。至少有一个expr不能是文字NULL。如果所有出现的expr都计算为null,则该函数返回null。

    NULLIF

    NULLIF(expr1, expr2)
    
      

    NULLIF比较expr1和expr2。如果它们相等,则该函数返回null。如果它们不相等,则函数返回expr1。您不能为expr1指定文字NULL。

    LNNVL

    LNNVL(condition)
    
      

    LNNVL提供了一种简明的方法来评估条件的一个或两个操作数可能为空时的条件。

    有关Oracle SQL Functions

    的更多信息

答案 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)。您可能想要考虑您的方案。

例如, 我试图根据特定条件从特定表中获取特定列的总和。根据条件,

  1. 表格中存在一行或多行。在这种情况下,我想要总和。
  2. 行不存在。在这种情况下,我想要0。
  3. 如果你在这里使用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)