Добавление со значениями NULL

В хранимой процедуре (в моем случае Oracle) я хочу добавить некоторые значения в существующую запись. Проблема в том, что и существующее значение, и значение, которое нужно добавить, могут быть нулевыми. Я хочу, чтобы результат был NULL только тогда, когда оба операнда равны нулю. Если только один из них равен нулю, я хочу, чтобы результатом был другой операнд. Если оба не равны нулю, я хочу, чтобы результат был "нормальным" сложением.

Вот что я использую до сих пор:

SELECT column INTO anz_old FROM aTable Where <someKeyCondition>;
IF anz_old IS NULL
THEN
    anz_new := panzahl;
ELSE
    anz_new := anz_new + NVL (panzahl, 0);
END IF;
UPATE aTabel set column = anz_new Where <someKeyCondition>;

Есть ли более элегантный способ (желательно полностью в SQL, т.е. просто в операторе обновления, за исключением длинного оператора CASE, в основном с той же логикой, что и в приведенном выше коде)?


person Thorsten    schedule 20.11.2009    source источник


Ответы (5)


Если вы хотите добавить a и b, и любой из них может быть нулевым, вы можете использовать объединение, которое возвращает первый ненулевой параметр, который вы ему передаете:

coalesce(a+b, a, b)

Таким образом, в этом случае, если ни один из параметров не равен нулю, он вернет сумму. Если только b имеет значение null, он пропустит a+b и вернет a. Если a равно null, он пропустит a+b и a и вернет b, который будет нулевым, только если они оба равны нулю.

Если вы хотите, чтобы ответ был равен 0, а не нулю, если и a, и b равны нулю, вы можете передать 0 в качестве последнего параметра:

coalesce(a+b, a, b, 0)

Подумайте об @erwins answer - null может быть неправильным для использования.

person rjmunro    schedule 20.11.2009
comment
Ответ Coalesce интересен. Для более чем двух значений или другого логического вида мне нравится: ISNULL (a, 0.0) + ISNULL (b, 0.0) + ISNULL (c, 0.0) - person Mister_Tom; 21.02.2014
comment
Я предполагаю, что ISNULL предназначен для T-SQL, Coalesce или NVL подходят для Oracle, как это используется в вопросе. - person Mister_Tom; 21.02.2014
comment
@Mister_Tom Ваш ответ вернет 0 для всех входных данных null. Мой coalesce(a+b, a, b) вернет null, что может быть или не быть тем, что нужно. Если вы хотите, чтобы он возвращал 0, вы можете использовать coalesce(a+b, a, b, 0). Я отредактировал свой ответ, чтобы добавить эту дополнительную опцию. - person rjmunro; 15.10.2014
comment
Единственная проблема в том, что если вы ищете a+b+c+d+e+f, то это решение значительно хуже, чем то, что показано ниже. - person Steve Horvath; 09.06.2016

Я выполнил это следующим образом:

coalesce("Column1",0.00) + coalesce("Column2",0.00)

Я работаю с руководителями высокого уровня переднего плана... Они не понимают, почему NULL и 0 не обрабатываются одинаково.

В моем случае это работает, просто заменив NULL на 0.00... может и не во всех :)

person sean    schedule 04.09.2012
comment
Этот ответ вернет 0, если оба значения равны нулю. Мой ответ вернет ноль. В зависимости от того, что вы делаете, это может быть предпочтительнее (а может и нет - это хороший ответ). - person rjmunro; 11.12.2012
comment
@fancyPants Этот ответ более читаем, чем принятый ответ imo - person Lukasz Matysiak; 29.12.2017

Вы также можете использовать ISNULL, поэтому, если у вас есть 3 значения

isnull(val1,0)+isnull(val2,0)+isnull(val3,0)

в каком столбце будет NULL, будет использоваться 0, в противном случае его исходное значение.

person user734028    schedule 01.07.2017
comment
Это лучший ответ, так как его можно использовать в любой ситуации. Опция COALESCE() полезна для A+B. Но если вы хотите A+B+C+D+... нет смысла пытаться его использовать. ISNULL() всегда работает. - person MarcM; 27.06.2018
comment
Поскольку в исходном ответе не указан какой-либо механизм SQL: ISNULL() работает для SQL-сервера, IFNULL() для MySQL и NVL() для Oracle. Подробности на странице w3schools.com/sql/sql_isnull.asp. - person MarcM; 27.06.2018

В SQL Null должен быть состоянием, говорящим «я не знаю».

Если вы не знаете, сколько составляет b, то вы также не знаете, сколько составляет a+b, и в этом случае будет ошибкой делать вид, что a+b=a.

person Erwin Smout    schedule 20.11.2009
comment
Верно, но это может быть лучшая оценка, которая у вас есть. - person rjmunro; 20.11.2009
comment
Что ж, мы можем вступить в дискуссию о том, что не знаю, неприменимо и т. д. для NULL. В моем случае NULL лучше всего соответствует n/a .. поэтому, если у меня есть значение Non-NULL и NULL, справедливо использовать значение .. оно лучше всего соответствует тому, что я моделирую. - person Thorsten; 20.11.2009
comment
Неважно, что означает Null в SQL, важно, что означает Null в коде или в отчетах. - person thepaulpage; 18.02.2015
comment
Если имеет значение, что означает Null в коде (/application), то правильно сделать для SQL, когда ему нужно выполнить операцию, включающую Null, это обратиться к приложению и спросить. Поскольку этот вариант недоступен, разработчики SQL должны выбирать сами, документировать свой выбор и надеяться, что разработчики приложений затем примут обоснованные решения о введении NULL в свои проекты и об операциях кодирования, которые потенциально могут включать эти NULL. Сделанный выбор состоит в том, чтобы NULL представлял неизвестное. Неприменимо - это просто дизайнер, выдающий собственную некомпетентность. - person Erwin Smout; 19.02.2015

В терминах SQL при добавлении чисел результат NULL означает, что не было добавлено ненулевых чисел.

Это говорит о том, что разумным ответом в терминах SQL будет

СЛУЧАЙ, КОГДА A ЕСТЬ NULL И B ЕСТЬ NULL THEN NULL ELSE ISNULL(A, 0) + ISNULL(B, 0) END

person justasqluser    schedule 21.02.2019