3
IF purpose = null THEN
   v_purpose := '';
ELSE
   v_purpose := ' for ' || purpose;
END IF;

目的が null の場合でも、else に移動します...なぜ?!

4

3 に答える 3

5

正しいテストは

IF purpose IS NULL THEN

これは、フィールドに格納されたNULLではないためです。これは、 別の場所 (ただし、行内) に格納されているフィールドに関する属性です。

フィールドを に設定するNULLことは通常の割り当てのように見えるため、直接比較によるテストを期待することは完全に直交しているようです。ただし、それが機能するためには、SQL割り当てプリミティブにはNULL、フィールドではなく属性の設定に特殊記号の割り当てを転用する魔法の隠れた側面があると思います。

于 2012-04-19T18:06:43.877 に答える
5

NULL は、等価演算子を使用して比較できない SQL の特別な値です。値が NULL かどうかをテストするときは、IS特別な演算子を使用する必要があります。IS NOT

これがアイデアの良い概要です。そして抜粋:

注: Null In Oracle は、情報の欠如です。null を割り当てることはできますが、それ自体を含め、何かと同等にすることはできません。NULL 値は、欠落したデータまたは不明なデータを表します。NULL 値は、整数、文字、またはその他の特定のデータ型ではありません。NULL は、空のデータ文字列または数値 '0' と同じではないことに注意してください。

于 2012-04-19T18:08:26.637 に答える
1

式の結果は、purpose = null何であれ不明purposeです (詳細については、@Paul Sasik の回答を参照してください)。不明なので必ずしも真とは限らないため、実行はブロック内を迂回してIFブロックに落ちELSEます。

于 2012-04-19T18:24:05.243 に答える