IF purpose = null THEN
v_purpose := '';
ELSE
v_purpose := ' for ' || purpose;
END IF;
目的が null の場合でも、else に移動します...なぜ?!
正しいテストは
IF purpose IS NULL THEN
これは、フィールドに格納された値NULL
ではないためです。これは、 別の場所 (ただし、行内) に格納されているフィールドに関する属性です。
フィールドを に設定するNULL
ことは通常の割り当てのように見えるため、直接比較によるテストを期待することは完全に直交しているようです。ただし、それが機能するためには、SQL割り当てプリミティブにはNULL
、フィールドではなく属性の設定に特殊記号の割り当てを転用する魔法の隠れた側面があると思います。
NULL は、等価演算子を使用して比較できない SQL の特別な値です。値が NULL かどうかをテストするときは、IS
特別な演算子を使用する必要があります。IS NOT
これがアイデアの良い概要です。そして抜粋:
注: Null In Oracle は、情報の欠如です。null を割り当てることはできますが、それ自体を含め、何かと同等にすることはできません。NULL 値は、欠落したデータまたは不明なデータを表します。NULL 値は、整数、文字、またはその他の特定のデータ型ではありません。NULL は、空のデータ文字列または数値 '0' と同じではないことに注意してください。
式の結果は、purpose = null
何であれ不明purpose
です (詳細については、@Paul Sasik の回答を参照してください)。不明なので必ずしも真とは限らないため、実行はブロック内を迂回してIF
ブロックに落ちELSE
ます。