web-dev-qa-db-ja.com

NULL値の加算

ストアドプロシージャ(私の場合はOracle)で、既存のレコードにいくつかの値を追加します。問題は、既存の値と追加される値の両方がnullになる可能性があることです。両方のオペランドがnullの場合にのみ結果をnullにしたい。それらの1つだけが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>;

よりエレガントな方法はありますか?

25
Thorsten

Aとbを追加し、どちらかがnullの可能性がある場合は、coalesceを使用できます。これは、渡した最初のnull以外のパラメーターを返します。

coalesce(a+b, a, b)

したがって、この場合、どちらのパラメーターもnullでない場合、合計が返されます。 bだけがnullの場合、a + bをスキップしてaを返します。 aがnullの場合、a + bとaをスキップしてbを返します。bは、両方がnullの場合にのみnullになります。

Aとbの両方がnullの場合に、答えをnullではなく0にしたい場合は、最後のパラメーターとして0を渡すことができます。

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

考慮してください @ erwins answer -nullを使用するのは適切ではないかもしれません。

57
rjmunro

私はこのようにしてそれを達成しました:

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

私はフロントエンドの高レベルのexecを使用しています。彼らは、NULLと0が同じように処理されない理由を理解していません。

私の場合、それは機能しますが、NULLを0.00に置き換えるだけで、すべてがうまくいくとは限りません:)

10
sean

SQLでは、Nullは「わからない」という状態になるはずです。

Bの量がわからない場合は、a + bの量もわからないため、その場合はa + b = aであると誤解されます。

8
Erwin Smout

ISNULLを使用することもできるため、3つの値がある場合

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

nULLを持つ列は0を使用し、それ以外の場合は元の値を使用します。

5
user734028

SQL用語では、数値を追加する場合、NULLの結果はNULL以外の数値が追加されなかったことを意味します。

これは、SQL用語での賢明な答えは

A IS NULL AND B IS NULL THEN NULL ELSE ISNULL(A、0)+ ISNULL(B、0)の場合の終わり

0
justasqluser