2
SELECT inv_no,NVL2(inv_amt,inv_date,'Not Available')
FROM invoice;

SELECT inv_no,NVL2(inv_amt,inv_amt*.25,'Not Available') FROM invoice;

取得

ORA-01858: a non-numeric character was found where a numeric was expected
ORA-01722: invalid number

それぞれexpr1とexpr2で指定できるデータ型を提案してください。

また、これがどのように正しいか教えてください。

SELECT inv_no,NVL2(inv_date,sysdate-inv_date,sysdate)
FROM invoice
4

3 に答える 3

6

2番目と3番目のパラメーターNVL2は同じデータ型である必要があります。したがって、がDATEであると仮定すると、それを同じようinv_dateに持つ必要があります。varchar2

SELECT inv_no, NVL2(inv_amt, to_char(inv_date, 'dd-mon-yyyy hh24:mi:ss'), 'Not Available') FROM ...

または必要なフォーマット文字列。それ以外の場合、Oracleは3番目のパラメータ'Not Available'を2番目のパラメータのデータ型に一致するように変換します。これは日付に変換しようとして'Not Available'クラッシュします。

同様に、2番目の例では、を介してをcharに変換する必要がありinv_amt*.25ます。to_charto_char(inv_amt*.25)

于 2013-02-12T14:04:42.080 に答える
1

最初の2つの例では、同じフィールドの日付/数値とテキストの結果を取得しようとしています。これにより、Oracleがこのテキストをいずれかのタイプに変換しようとしたときにエラーが発生します。to_char(field)日付/数値フィールドの関数を使用して、テキストに変換する必要があります。

最後に、日付は実際にはデータベースの基準日に追加された数値です。たとえば、日付は基準日の数値であり、小数は1日の比率です。たとえば、0.5は12時間であり、データベースには基準日があります(例:01-Jan-1900または)01-Jan-2000。これがdate - date、結果が数値であり、日付も数値として表すことができる理由です。

于 2013-02-13T09:56:37.983 に答える
1

参照: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のドキュメントに固執し、明示的な変換を使用することをお勧めします。

于 2017-06-22T06:28:44.350 に答える