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'
我曾尝试通过将 NULLIF
与 LENGTH()
函数组合来解决此问题,但这是不允许的:
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
我正在加载具有日期值的特定字段。然而,其中一些并不完整......例如值看起来像这样
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)<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