Oracle - 检查null Date时出现不一致的数据类型错误

时间:2016-09-23 16:23:45

标签: oracle date

我正在尝试为Date为空时写一个案例,但我一直收到此错误:

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

代码非常简单。与null比较时,是否有其他方法可以检查Date

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

2 个答案:

答案 0 :(得分:4)

这里的问题是case when语句

的返回值
cr.COMPLETED_DATE is null then '--'

返回string datatype

else cr.COMPLETED_DATE

返回date datatype,因此错误

  

不一致的数据类型:预期CHAR得到DATE

一种解决方法是将第二种情况的数据类型更改为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,

答案 1 :(得分:0)

case表达式的两个分支获得不同的数据类型。如果该列为空,则您提供字符串'--'。如果它不为null,那么您使用的是原始日期。这就是错误消息告诉你的。

如果你想让null case使用一个字符串,那么not-null的情况也必须产生一个字符串,所以你必须使用合适的格式模型将你的日期转换为字符串(don&#39) ; t依赖于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
--        

case表达式的结果是两行的字符串。

你可以用

做同样的事情
nvl(to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD'), '--') completed_date,

但是案例更便携,而且更清晰。