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;
我正在尝试在 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;