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

sqlldr - how to use if/then logic on a field?

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

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)<10 to_date .....

这个returns错误

Expecting positive integer or column name, found keyword length.

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

在oracle中,你可以验证一个字符串来确定它是否是有效日期。请检查 IsDate 功能。

假设我有这样一个 table:

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