sqlldr - 如何在字段上使用if / then逻辑?

时间:2016-12-28 08:45:51

标签: sql oracle sql-loader

我正在加载具有日期值的特定字段。但是,其中一些还不完整...例如,值看起来像这样

START_DATE  

'2015-06-12'  
'2016-12-24'   
'2015-02'      <--- this is what causes an error  
'2016-01-03'

我尝试通过将NULLIFLENGTH()函数结合起来来解决此问题,但这是不允许的:

  

Start_date NULLIF LENGTH(:start_date)&lt; 10 to_date .....

这会返回错误

  

期望正整数或列名,找到关键字长度。

我的主要目标是加载格式正确的日期,否则加载NULL。在ctl文件中执行此操作的最简单方法是什么?我可以避免创建自定义函数吗?

2 个答案:

答案 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功能。