CAST(日期为空)

CAST(NULL AS DATE)

我正在尝试在 Oracle 中创建一个已在 DB2 中定义的视图,在 DB2 视图中,所有日期列都具有转换函数,下面我通过从视图中获取一个日期列创建了一个视图。 Note: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 语法?

空值不需要转换。只需单独使用 NULL

case when COBDATE = 0 then NULL
else <some date> end as COBDATE2

也不需要所有这些括号。

cast 不是问题,尽管它并不是真正需要的。 'missing expression' 错误是针对第 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;