我正在尝试为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,
答案 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,
但是案例更便携,而且更清晰。