为什么SQL中的这些NVL()语句错误?

Sat*_*esh 2 sql oracle

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;
Run Code Online (Sandbox Code Playgroud)

越来越

ORA-01858: a non-numeric character was found where a numeric was expected
ORA-01722: invalid number
Run Code Online (Sandbox Code Playgroud)

请分别建议我在expr1和expr2中给出的数据类型是什么.

还请告诉我这是怎么回事?

SELECT inv_no,NVL2(inv_date,sysdate-inv_date,sysdate)
FROM invoice
Run Code Online (Sandbox Code Playgroud)

Daz*_*zaL 6

第二个和第三个参数NVL2应该是相同的数据类型.所以,假设inv_date是DATE,你需要varchar2像那样;

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

或者你想要的任何格式字符串.否则,Oracle将转换第3个参数'Not Available'以匹配第2个参数的数据类型.这将尝试转换'Not Available'为日期和崩溃.

类似地,在第二个示例中,您必须通过转换inv_amt*.25为char to_char,例如to_char(inv_amt*.25).