将Varchar2转换为日期-使用Case / Decode / IIF语句,并在1种情况下设置空值

时间:2018-10-04 21:28:01

标签: oracle

我有一列以varchar2(4000)作为数据类型。但是,此列具有以下类型的值 '//' '112/01/01' 该列是日期列

我想得到以下输出- 如果'//'然后将其设置为NULL 如果将“ 112/01/01”设置为2012/01/01

我在使用case / decode / iif语句并将值设置为NULL时遇到问题。

我尝试了以下SQL语句,它给出了ORA-00932错误或Ora-01841错误。

这是我的声明:

SELECT 
CASE WHEN DATE_CATALOG_SENT = '//' THEN to_date('1950/01/01'), 'yyyy/mm/dd')
     ELSE TO_DATE(substr(DATE_CATALOG_SENT, 2, LENGTH(DATE_CATALOG_SENT)),'yyyy/mm/dd')
END AS abcd
FROM 
DUAL;

SELECT  CASE WHEN DATE_CATALOG_SENT = 0 THEN 'NULL'
             ELSE TO_DATE(substr(DATE_CATALOG_SENT, 2,  LENGTH(DATE_CATALOG_SENT)),'yy/mm/dd') 
END 
FROM DUAL;

有没有办法仅使用SQL查询而不使用PL / SQL来解决此问题?

谢谢 广告

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

with inputs (dt_str) as (
  select '//'        from dual union all
  select '112/01/01' from dual
)
select dt_str,
       to_date(to_char(19000000 + to_number(replace(dt_str, '/')), 'fm00000000')
       , 'yyyymmdd') as resulting_dt
from   inputs
;

DT_STR    RESULTING_DT           
--------- -----------------------
//                               
112/01/01 2012-01-01  

即:首先删除斜线;字符串变为空(NULL)或七位数的字符串。将结果字符串转换为数字,然后添加19000000;如果初始字符串只是NULL,则总和仍为'//',否则-转换回字符串后-它会以yyyymmdd格式正确表示日期为字符串。使用to_date(...)最终将其转换为日期。如果输入的是'//',则生成的日期将是NULL

如果在输入为'//'的情况下希望日期默认为1950-01-01而不是null,则可以将整个to_date(...)表达式包装在NVL(......., date '1950-01-01')