ORACLE,忽略null求和

ORACLE, ignore null to sum

我想将一行的两列(数字类型)加在一起,但是当其中一列为空时,结果为空。我通过 NVL 函数 (NVL(col1,0) + NVL(col2,0)) 处理了它。但是当两者都为空(而不是 0)时,我想 return 为空。 我该如何处理? ORACLE中有忽略空值求和一行两列的函数吗?

| col1 | col2  |                                     |
|:---- |:-----:|:-----------------------------------:|
|  1   |   2   |      --> result have to be : 3      |
|  1   |  null |     --> result have to be : 1       |
| null |  null |     --> result have to be : null    |

CASE 表达式可能是最简单的方法:

SELECT CASE WHEN col1 IS NULL AND col2 IS NULL
            THEN NULL
            ELSE NVL(col1, 0) + NVL(col2, 0) END AS output
FROM yourTable;

coalesce(col1+col2,col1,col2) 会更容易:

with t(col1,col2) as (
  select 0,1 from dual union all
  select 2,null from dual union all
  select null,3 from dual union all
  select null,null from dual
  )
select 
  col1,col2,
  coalesce(col1+col2,col1,col2) sum_cols  
from t;

结果:

      COL1       COL2   SUM_COLS
---------- ---------- ----------
         0          1          1
         2       null          2
      null          3          3
      null       null       null

4 rows selected.

如果要求和的列更多,则使用求和子查询:

(select sum(column_value) from table(sys.odcinumberlist(col1,col2,...,colN)))

示例:

with t(col1,col2) as (
  select 0,1 from dual union all
  select 2,null from dual union all
  select null,3 from dual union all
  select null,null from dual
  )
select 
  col1,col2,
  coalesce(col1+col2,col1,col2) sum_cols,
  (select sum(column_value) from table(sys.odcinumberlist(col1,col2))) sum_cols2
from t;

DBFiddle: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=eda8de9746f1d0def3c290420adbb705