我有一列以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来解决此问题?
谢谢 广告
答案 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')