質問: *質問を編集しました。 オラクル SQLのNULLIF関数についてですが テキスト(俗に言う白本です)にはNULLIF(式1,式2)とあり 式1にリラテルのNULL値以外を指定する必要があるとありますが NULL値を指定してもエラーにはならいのでしょうか? ``` SELECT product_id, NVL2(NNULLIF(list_price,min_price),100,0) FROM products; ``` 問題文のSQL文をそのまま抜き出してあります。 この問題で実行結果として正しいモノを選びなさいとあり 1:LIST_PRICE列にNULL値が含まれている場合、エラーになる 2:LIST_PRICE列にNULL値が含まれている場合、0が表示される とあり答えは2なります。 NULLIFの式1にNULL値を指定するとエラーになるはずなのに何故 0が表示されるのでしょうか? *問題に指定の表、追記等はありませんのでデータ型等でのエラーはないと仮定します。
回答: > > 式1にリラテルのNULL値以外を指定する必要があるとありますが > > NULL値を指定してもエラーにはならいのでしょうか? > > > 試す環境も無くて演習しているのですか? 都度、試せばわかる質問をされるつもりですか? そもそもNULLIFはNULL以外の値との比較関数ですので、第一引数にNULLを指定することになるケースでは使用しません。 第一引数にNULLを指定するとエラーになります。 使い勝手が良いのはCASE式でしょうね。 追記 > > 1:LIST_PRICE列にNULL値が含まれている場合、エラーになる > > 2:LIST_PRICE列にNULL値が含まれている場合、0が表示される > > > とあり答えは2なります。 > > NULLIFの式1にNULL値を指定するとエラーになるはずなのに何故0が表示されるのでしょうか? > > > `NULLIFの式1にNULL値を指定するとエラーになる` これは、`NULLIF(Null,min_price)`のようにリテラルのNUllを指定した場合で、`NULLIF(list_price,min_price)`の場合はエラーにはなりません。 NULLIF > > NULLIFは、expr1とexpr2を比較します。式が等しい場合、関数はNULLを返します。異なる場合は、expr1を戻します。**expr1には、リテラルNULLを指定できません。** > > > `list_price`がNullの場合、`NULLIF(list_price,min_price)`はNUllを返却し、その結果をNVL2の指定で0が返却されます。 ※その設問は**NULLIF**の「expr1には、リテラルNULLを指定できません。」を正しく理解しているかについてですから、リファレンスなどの読み込みが不足しているという事です。