DB2 SELECT, которая суммирует два столбца и обрабатывает нулевые значения - PullRequest
0 голосов
/ 03 октября 2019

Допустим, у меня есть текущая таблица MY_TABLE со столбцами A и B:

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

Что мне нужно, это выбор, который возвращает:

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

, но мне было интересно, есть ли лучшее из коробки? способ сделать это?

Ответы [ 4 ]

1 голос
/ 03 октября 2019

В вашем случае работает следующее выражение:

COALESCE(A, B) - COALESCE(A, B) + COALESCE(A, 0) + COALESCE(B, 0)
1 голос
/ 03 октября 2019

Попробуйте:

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

Есть много других способов сделать это.

0 голосов
/ 03 октября 2019

Не существует встроенного способа прозрачной интерпретации 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)

вернет

 S
 -

 1
 1
 2

Примечание Функция может быть проще, если вы создадите одну функцию для каждого числа параметров, которое вы хотитесуммировать, но единственная функция с DEFAULT s точнее

0 голосов
/ 03 октября 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...