我正在尝试在oracle中创建一个已在DB2中定义的视图,在DB2视图中所有日期列都具有强制转换功能,下面我通过从视图中取一个日期列创建了一个视图。注意:COBDATE列具有与设计相关的数字数据类型。我收到ORA-00936:表达式错误。
Create View MYVIEWV1 as (Select
A.COBDATE ,
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
(case when (COBDATE = 0)
then CAST(NULL AS DATE)
else
date(SUBSTR(COBDATE,1,4) ||
'-'||SUBSTR(COBDATE,5,2) ||
'-'||SUBSTR(COBDATE,7,2))
end ) as COBDATE2
from MYTBLT1 A;
请建议我如何将其转换为oracle语法?
答案 0 :(得分:4)
cast
不是问题,但并不是真的需要。针对第7行第4列报告了“缺少表达式”错误,这是对date()
函数的调用 - 这在Oracle中不存在。期望日期文字遵循关键字date
,而不是括号或函数参数。
您可以使用to_date()
函数,格式模型与您构造第一个参数的方式相匹配。你说cobdate
是一个数字,但是你把它当成一个字符串,所以我会继续隐含地这样做......
create table mytblt1 (cobdate number);
insert into mytblt1 values (20141225);
insert into mytblt1 values (0);
create view myviewv1 as
select cobdate,
case when cobdate = 0
then null -- or with unnecessary cast: cast(null as date)
else
to_date(substr(cobdate,1,4)
||'-'||substr(cobdate,5,2)
||'-'||substr(cobdate,7,2),
'YYYY-MM-DD')
end as cobdate2
from mytblt1;
select * from myviewv1;
COBDATE COBDATE2
---------- -------------------
20141225 2014-12-25 00:00:00
0
desc myviewv1
Name Null Type
-------- ---- ------
COBDATE NUMBER
COBDATE2 DATE
使用缩减日期格式模型 - 因此您不必担心-
分隔符 - 您可以进一步简化它:
create view myviewv1 as
select cobdate,
case when cobdate = 0
then null -- cast(null as date)
else
to_date(cobdate, 'YYYYMMDD')
end as cobdate2
from mytblt1;
或者您可以在函数调用中移动case
:
create view myviewv1 as
select cobdate,
to_date(case when cobdate = 0 then null else cobdate end, 'YYYYMMDD') as cobdate2
from mytblt1;
答案 1 :(得分:2)
Nulls不需要施法。只需单独使用NULL
即可。
case when COBDATE = 0 then NULL
else <some date> end as COBDATE2
也不需要所有这些括号。