2016-09-23 64 views
2

我試圖寫時Date爲空的情況下,但我不斷收到此錯誤時不一致的數據類型錯誤:甲骨文 - 檢查空日期

ORA-00932: inconsistent datatypes: expected CHAR got DATE 
00932. 00000 - "inconsistent datatypes: expected %s got %s" 
*Cause:  
*Action: 

的代碼非常簡單。是否有不同的方式比作Date當檢查null

case 
    when cr.COMPLETED_DATE is null then '--' 
    else cr.COMPLETED_DATE 
    end completed_date, 
+0

有趣,MySQL使用ORA-XXXXX代碼錯誤訊息?我認爲這只是Oracle。還有什麼其他的連接是有你的問題,Oracle數據庫之間(從MySQL不同的產品,即使來自同一供應商)?我看到Oracle標籤,是故意還是意外? – mathguy

+0

'ORA-00932'顯示其Oracle,更好地去除MySQL的標籤 – Praveen

+0

@praveen哦,我沒有注意到它,那傢伙說mysql的問題 –

回答

4

這裏的問題是與返回值從case when聲明

cr.COMPLETED_DATE is null then '--' 

回報string datatype

else cr.COMPLETED_DATE 

返回date datatype,因此錯誤

inconsistent datatypes: expected CHAR got DATE

一個解決是改變seco的數據類型第二殼體條件爲char

case 
    when cr.COMPLETED_DATE is null then '--' 
    else to_char(cr.COMPLETED_DATE, 'dd-mm-yyyy') 
end completed_date, 

或使用像 '1900-01-01' 的日期時的日期是null

case 
    when cr.COMPLETED_DATE is null then Date '1900-01-01' 
    else cr.COMPLETED_DATE 
end completed_date, 
0

您的case表達式的兩個分支獲得不同的數據類型。如果列是空你提供一個字符串,'--'。如果它不是null,那麼你正在使用原始日期。這是錯誤信息告訴你的。

如果你想空的情況下使用字符串,則非空的情況下也有可能產生一個字符串,所以你必須你的日期轉換爲字符串,使用合適的業態模式(不依賴上NLS設置),例如:

case 
    when cr.COMPLETED_DATE is null then '--' 
    else to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD') 
    end completed_date, 

快速演示的CTE:

with cr (completed_date) as (
    select date '2016-09-23' from dual 
    union all select null from dual 
) 
select 
case 
    when cr.COMPLETED_DATE is null then '--' 
    else to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD') 
    end completed_date 
from cr; 

COMPLETED_ 
---------- 
2016-09-23 
--   

的情況下表達的結果是對於兩行的字符串。

你可以做同樣的事情

nvl(to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD'), '--') completed_date, 

但情況下更便於攜帶,往往更清晰。