甲骨文 - 检查空日期

问题描述:

我试图写时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的问题 –

这里的问题是与返回值从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, 

您的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, 

但情况下更便于携带,往往更清晰。