Подтвердить что ты не робот

Сложение со значениями 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-Statement с в основном той же логикой, что и указанный выше код)?

4b9b3361

Ответ 1

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

coalesce(a+b, a, b)

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

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

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

Учесть ответ @erwins - null может быть неправильным.

Ответ 2

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

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

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

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

Ответ 3

В SQL Null предполагается, что это состояние, в котором говорится: "Я не знаю".

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

Ответ 4

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

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

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