2015-01-07 4 views
0

Я пытаюсь создать представление в oracle, которое уже определено в DB2, в представлении DB2 все столбцы даты, имеющие функцию трансляции, Ниже я создал представление, взяв один столбец даты из представления , Примечание: столбец COBDATE, имеющий тип данных типа, как для дизайна. Я получаю ORA-00936: отсутствует ошибка выражения.CAST (NULL AS DATE)

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; 

, пожалуйста, предложите, как я могу преобразовать это в синтаксис оракула?

ответ

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; 
+0

Спасибо за ответ @Alex – sabya

2

Нумерам не требуется лить. Просто используйте NULL самостоятельно.

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

Не нужны все эти скобки.