2016-11-25 83 views
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" 
+0

'和T AS(SELECT '1234' LV FROM DUAL) SELECT CASE WHEN LV IS NOT NULL THEN LV ELSE '1'END FROM T;' – MT0

+0

@ MT0當然這會返回我們期望的結果,但這並不能解釋爲什麼Oracle在'case'中做數字轉換而不在'nvl'中 – Kacper

+2

解釋是這是Oracle做了什麼。閱讀有關'NVL函數'和'CASE表達式'的Oracle文檔。這些文檔清楚地說明了當涉及的數據類型都不相同時每個行爲的表現。 –

回答

1

問題是在你的case語句。

CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END

這LV是varchar類型和else語句,你是作爲不同的數據類型創建問題的整數值分配1。下面所提到

只要更新您的case語句,它會在Oracle工作

CASE WHEN LV IS NOT NULL THEN LV ELSE '1' END