我正在加载具有日期值的特定字段。但是,其中一些还不完整...例如,值看起来像这样
START_DATE
'2015-06-12'
'2016-12-24'
'2015-02' <--- this is what causes an error
'2016-01-03'
我尝试通过将NULLIF
与LENGTH()
函数结合起来来解决此问题,但这是不允许的:
Start_date NULLIF LENGTH(:start_date)&lt; 10 to_date .....
这会返回错误
期望正整数或列名,找到关键字长度。
我的主要目标是加载格式正确的日期,否则加载NULL。在ctl文件中执行此操作的最简单方法是什么?我可以避免创建自定义函数吗?
答案 0 :(得分:1)
说我有这样一张桌子:
create table dateTable(START_DATE date)
我需要加载这个文件,我要插入NULL
,其中字符串与我的模式不匹配
'2016-12-28'
'2016-12-'
'2016-12-31'
我可以在 ctl 文件中添加一些逻辑,以检查要以这种方式加载的字符串的长度:
load data
infile dateTable.csv
into TABLE dateTable
fields enclosed by "'"
( START_DATE "to_date(case when length(:START_DATE) = 10 then :START_DATE end, 'yyyy-mm-dd')"
)
这只是检查字符串的长度,但你可以编辑它,无论如何你需要构建自己的逻辑;请注意CASE
在没有条件匹配时给出NULL
,因此这相当于case when length(:START_DATE) = 10 then :START_DATE else NULL end
。
这给出了以下结果:
SQL> select * from dateTable;
START_DATE
----------
28-DEC-16
31-DEC-16
答案 1 :(得分:0)
在oracle中,您可以验证字符串以确保它是否为有效日期。请检查IsDate功能。