2
我有一個只有數字和空格的字符串。
我正在使用CASE和NVL函數來獲取輸出。
如果字符串爲NULL,則使用相同的字符串值,否則使用1.
我可以針對SQL和PLSQL採用不同的行爲。
任何人都可以提供關於這種行爲的一些解釋,哪一個是最好的方法。CASE語句和NVL在Oracle11G中提供不同的輸出
在SQL
NVL功能工作,沒有TRIM提供結果
CASE給出ORA-00932錯誤
WITH T AS (SELECT ' 1234' LV FROM DUAL)
SELECT CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END
FROM T;
Error report:
SQL Error: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
在PLSQL
NVL提供了空間,導致
SET SERVEROUTPUT ON
DECLARE
LV VARCHAR2(10):=' 1234';
BEGIN
DBMS_OUTPUT.PUT_LINE('BEFORE CASE -"'||LV||'"');
LV:=NVL(LV,1);
DBMS_OUTPUT.PUT_LINE('AFTER CASE -"'||LV||'"');
END;
Result:
BEFORE CASE -" 1234"
AFTER CASE -" 1234"
Case語句修剪結果
SET SERVEROUTPUT ON
DECLARE
LV VARCHAR2(10):=' 1234';
BEGIN
DBMS_OUTPUT.PUT_LINE('BEFORE CASE -"'||LV||'"');
LV:=CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END;
DBMS_OUTPUT.PUT_LINE('AFTER CASE -"'||LV||'"');
END;
Result:
BEFORE CASE -" 1234"
AFTER CASE -"1234"
'和T AS(SELECT '1234' LV FROM DUAL) SELECT CASE WHEN LV IS NOT NULL THEN LV ELSE '1'END FROM T;' – MT0
@ MT0當然這會返回我們期望的結果,但這並不能解釋爲什麼Oracle在'case'中做數字轉換而不在'nvl'中 – Kacper
解釋是這是Oracle做了什麼。閱讀有關'NVL函數'和'CASE表達式'的Oracle文檔。這些文檔清楚地說明了當涉及的數據類型都不相同時每個行爲的表現。 –