ストアドプロシージャ(私の場合は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>;
よりエレガントな方法はありますか?
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
を使用するのは適切ではないかもしれません。
私はこのようにしてそれを達成しました:
coalesce("Column1",0.00) + coalesce("Column2",0.00)
私はフロントエンドの高レベルのexecを使用しています。彼らは、NULLと0が同じように処理されない理由を理解していません。
私の場合、それは機能しますが、NULLを0.00に置き換えるだけで、すべてがうまくいくとは限りません:)
SQLでは、Nullは「わからない」という状態になるはずです。
Bの量がわからない場合は、a + bの量もわからないため、その場合はa + b = aであると誤解されます。
ISNULLを使用することもできるため、3つの値がある場合
isnull(val1,0)+isnull(val2,0)+isnull(val3,0)
nULLを持つ列は0を使用し、それ以外の場合は元の値を使用します。
SQL用語では、数値を追加する場合、NULLの結果はNULL以外の数値が追加されなかったことを意味します。
これは、SQL用語での賢明な答えは
A IS NULL AND B IS NULL THEN NULL ELSE ISNULL(A、0)+ ISNULL(B、0)の場合の終わり