2009-11-20 3 views
18

В хранимой процедуре (в нашем случае Oracle) я хочу добавить некоторые значения в существующую запись. Проблема в том, что как существующее значение, так и добавляемое значение могут быть нулевыми. Я хочу, чтобы результат был равен NULL, когда оба операнда равны нулю. Если только один из них является нулевым, я хочу, чтобы результатом был другой операнд. Если оба значения не равны нулю, я хочу, чтобы результат был «нормальным» дополнением.Дополнение с 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>; 

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

ответ

41

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

coalesce(a+b, a, b) 

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

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

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

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

+0

Ответ Coalesce интересен. Для более чем двух значений или другого логического вида мне нравится: ISNULL (a, 0.0) + ISNULL (b, 0.0) + ISNULL (c, 0.0) –

+0

Я предполагаю, что ISNULL для T-SQL, Coalesce или NVL будет подходит для Oracle, как используется в вопросе. –

+0

@Mister_Tom Ваш ответ вернет 0 для всех входов null. Мой 'coalesce (a + b, a, b)' возвращает null, что может быть или не быть тем, что требуется. Если вы хотите, чтобы он возвращал 0, вы могли бы использовать 'coalesce (a + b, a, b, 0)'. Я отредактировал свой ответ, чтобы добавить этот дополнительный параметр. – rjmunro

4

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

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

+0

Правда, но это может быть лучшая оценка, которая у вас есть. – rjmunro

+1

Ну, мы можем попасть в дебаты, не знаю, не применимо и т. Д. Для NULL. В моем случае NULL лучше всего соответствует n/a .. поэтому, если у меня есть значение NULL и NULL, справедливо использовать значение.он лучше всего сопоставляет то, что я моделирую. – Thorsten

+0

Не имеет значения, что Null должен быть в SQL, это имеет значение, что Null означает в коде или в отчетности. – thepaulpage

7

я достиг это так:

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

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

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

+1

Если честно, принятый ответ немного более изящный. – fancyPants

+5

Этот ответ вернет 0, если оба значения равны нулю. Мой ответ вернет null. В зависимости от того, что вы делаете, это может быть предпочтительным (или это может быть не так - это хороший ответ). – rjmunro

+0

Это помогло мне, спасибо. – gazrolo4

2

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

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

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

Смежные вопросы