nvl2(v1, v2, v3) 定義:如果v1為空,返回v3; 不為空,返回v2
nvl2要求v2,v3的類型一致,不一致會發生類型轉換。問題:最終返回值類型是v2的類型還是v3的類型?
看題目:nvl2(null,sysdate-(sysdate-1/24/60), sysdate) 最終返回的是什么類型?
如果做一下實驗,可能看得更明白一些:
select nvl2(1, sysdate-(sysdate-1/24/60), sysdate) from dual;
select nvl2(null,sysdate-(sysdate-1/24/60), sysdate) from dual;
select nvl2(1, sysdate, sysdate-(sysdate-1/24/60) from dual;
select nvl2(null, sysdate, sysdate-(sysdate-1/24/60) from dual;
select sysdate-1/24/60 from dual;
上面兩條語句正確執行,中間兩條語句報錯:ORA-00932:數據類型不一致:應為DATE,但卻獲得DATE JULIAN
下面是nvl2執行路徑:
結論:最終類型將會是v2類型
例子中帶了一個知識點,date可以隱式轉換成number類型,反之則不行。
date如果要手工轉成number則比較復雜,可以用to_char(sysdate, 'fm....')轉成字符,再to_number('2013-01-01', '9999G99G99', 'nls_numeric_characters=,-')