参照:https ://docs.oracle.com/cd/B19306_01/server.102/b14200/functions106.htm
2番目の引数は、文字または数値のいずれかである必要があります。2番目の引数は、3番目の引数が暗黙的に変換されるデータ型を示します。それで:
1.
SELECT inv_no,NVL2(inv_amt,inv_date,'Not Available') FROM invoice;
2番目の引数としてDATEを指定できないため、最初の引数は正しくありません。
同じ方法:
SELECT NVL2(NULLIF(1, 1), SYSDATE, 'A') FROM DUAL; -- FAILS;
SELECT NVL2(NULLIF(1, 0), SYSDATE, 'A') FROM DUAL; -- FAILS;
SELECT NVL2(NULLIF(1, 1), 'A', SYSDATE) FROM DUAL; -- PASS; returns SYSDATE (as char datatype)
SELECT NVL2(NULLIF(1, 0), 'A', SYSDATE) FROM DUAL; -- PASS; returns 'A';
2. 2番目も無効です
SELECT inv_no,NVL2(inv_amt,inv_amt*.25,'Not Available') FROM invoice;
。Oracleは、3番目の引数を2番目の引数のデータ型に暗黙的に変換しようとします。つまり、「使用不可」を数値に変換しようとします。
2番目と3番目の引数を入れ替えると機能します。
SELECT inv_no,NVL2(inv_amt,'Not Available',inv_amt*.25) FROM invoice;
inv_amt*.25は暗黙的に文字データに変換されます。この例は、NULL * .25を取得してNULLにするため、役に立ちません。
ただし、数値結果を文字に変換することにより、両方のパラメーターを文字として作成できます。
SELECT inv_no,NVL2(inv_amt,TO_CHAR(inv_amt*.25), 'Not Available') FROM invoice;
特に通貨を表示したい場合は、ある程度意味があります。
3.3番目のものはより複雑です
私が説明できる唯一の方法は、2番目の引数が3番目の引数を処理する前に文字に変換されることです。そうすれば、3番目のものも文字に変換されます。これは、次の2つの場合を考えると理にかなっています。
SELECT NVL2(2, SYSDATE - TO_DATE('10-JAN-83'), SYSDATE) from dual; -- PASSES
SELECT NVL2(2, 2.2, SYSDATE) from dual; -- FAILS.
最後に、Oracleのドキュメントに固執し、明示的な変換を使用することをお勧めします。