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)
没有内置方法可以将 NULL
s 透明地解释为 0
s。
可能你能得到的最接近的函数是像这样的函数
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
注意如果您为每个要求和的参数创建一个函数,该函数可能会更简单,但是带有 DEFAULT
s 的单个函数更简洁
假设我有 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)
没有内置方法可以将 NULL
s 透明地解释为 0
s。
可能你能得到的最接近的函数是像这样的函数
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
注意如果您为每个要求和的参数创建一个函数,该函数可能会更简单,但是带有 DEFAULT
s 的单个函数更简洁