DB2 SELECT 对两列求和并处理空值

DB2 SELECT which sums two columns and handles null values

假设我有 A 列和 B 列的 table MY_TABLE:

NULL, NULL
NULL, 1
1, NULL,
1, 1
0, 0

我需要的是一个select,其中returns:

NULL
1
1
2
0
SELECT A + B
  FROM MY_TABLE

将导致:

NULL
NULL
NULL
2
0

目前,我已经编写了新的 MY_SUM 函数,因此我可以拥有:

SELECT MY_SUM(A, B)
FROM MY_TABLE
CREATE FUNCTION MY_SUM(IN decimalNumber1 DECIMAL(20, 2), IN decimalNumber2 DECIMAL(20, 2))
RETURNS DECIMAL(20, 2)
BEGIN

    DECLARE decimalSum DECIMAL(20, 2);

    IF decimalNumber1 IS NOT NULL THEN
        SET decimalSum = decimalNumber1;
    END IF;

    IF decimalNumber2 IS NOT NULL THEN 
        IF decimalSum IS NULL THEN
            SET decimalSum = decimalNumber2;
        ELSE
            SET decimalSum = decimalSum + decimalNumber2;
        END IF;
    END IF;

    RETURN decimalSum;
END

但我想知道是否有更好的开箱即用方式来执行此操作?

试试这个:

select case when a is null and b is null then null else coalesce(a,0)+coalesce(b,0) end from my_table

"select case when coalesce(a,b) is null then null else coalesce(a,0)+coalesce(b,0) end from my_table

还有很多其他方法。

COALESCE 将完成这项工作 - 您的问题没有得到完整描述,但请查看此

WITH temp  (a, b) AS (
VALUES (NULL, NULL), (NULL, 1), (1, NULL), (1, 1)
)

SELECT COALESCE(a,0) + COALESCE(b,0)
FROM temp
WHERE COALESCE(a,0) + COALESCE(b,0) <> 0

以下表达式适用于您的情况:

COALESCE(A, B) - COALESCE(A, B) + COALESCE(A, 0) + COALESCE(B, 0)

没有内置方法可以将 NULLs 透明地解释为 0s。

可能你能得到的最接近的函数是像这样的函数

CREATE OR REPLACE FUNCTION MY_SUM(
    n1 DECFLOAT DEFAULT NAN
   ,n2 DECFLOAT DEFAULT NAN
   ,n3 DECFLOAT DEFAULT NAN
   ,n4 DECFLOAT DEFAULT NAN
   ,n5 DECFLOAT DEFAULT NAN
) RETURNS DECFLOAT
RETURN
    CASE WHEN COALESCE(NULLIF(n1,NAN),NULLIF(n2,NAN)) IS NOT NULL THEN
  + COALESCE(NULLIF(n1,NAN),0)
  + COALESCE(NULLIF(n2,NAN),0)
  + COALESCE(NULLIF(n3,NAN),0)
  + COALESCE(NULLIF(n4,NAN),0)
  + COALESCE(NULLIF(n5,NAN),0)
  END

您可以根据需要对其进行扩展以支持更多列

SELECT MY_SUM(a,b) AS SUM
FROM TABLE(VALUES (NULL, NULL), (NULL, 1), (1, NULL), (1, 1)) T(a,b)

然后return

 S
 -

 1
 1
 2

注意如果您为每个要求和的参数创建一个函数,该函数可能会更简单,但是带有 DEFAULTs 的单个函数更简洁