要导入的列中的SQLLDR和NULL字段检测

时间:2011-05-23 17:53:33

标签: database oracle csv import sql-loader

SQLLDR和CTL文件

要导入CSV文件。

我想在我的CTL文件中指定只在我的CSV文件中的某个列中有空值时才插入到我的表中。 E.G我只想上传终止日期的用户记录。

我尝试了各种选项

  • 当TERMINATIONDATE =''
  • 当TERMINATIONDATE =“”
  • 当TERMINATIONDATE = null
  • 当TERMINATIONDATE ='null'时

它只在我使用时才有效 - TERMINATIONDATE!='' 然后我得到所有已被终止的员工。 但我想要相反的......

毕竟看起来不可能吗?

我的CTL文件

OPTIONS (SKIP=1)
LOAD DATA
INFILE 'C:\temp\users.csv' 
BADFILE 'C:\temp\users.bad'
DISCARDFILE 'C:\temp\users.dsc'
TRUNCATE
INTO TABLE "alawakaba"."users"
When TERMINATIONDATE = ''
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
ID,
FIRSTNAME,
LASTNAME,
FUNCTION,
DEPARTMENT,
COSTCENTER,
HIREDATE,
Field8 FILLER,
TERMINATIONDATE,
LOCCODE
)

(Column8只是我不需要的一个,所以我正在跳过它)

了解你的见解。

2 个答案:

答案 0 :(得分:1)

它应该与以下条款一起使用:

WHEN TERMINATIONDATE = BLANKS

答案 1 :(得分:0)

哦,明白了.. 它不是最终解决方案,并且有一些开销,但我可以在2次运行中完成

a)以上述CTL运行。 改变
当TERMINATIONDATE =''时 到 当TERMINATIONDATE!=''

丢弃的记录将被注入 DISCARDFILE'C:\ temp \ users.dsc' 现在我丢弃的文件将包含我想上传的所有记录

b)运行第二个CTL命令以取消DSC文件作为输入,不再跳过记录并且不指定when子句

LOAD DATA
INFILE 'C:\temp\users.dsc' 
BADFILE 'C:\temp\users.bad'
DISCARDFILE 'C:\temp\users-run2.dsc'
TRUNCATE
INTO TABLE "alawakaba"."users"
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
ID,
FIRSTNAME,
LASTNAME,
FUNCTION,
DEPARTMENT,
COSTCENTER,
HIREDATE,
Field8 FILLER,
TERMINATIONDATE,
LOCCODE
)

不是最好的或最快的,但它可以解决问题。

无法相信这样一个简单的子句从SQLLDR开始就不起作用。 无论如何,希望它有所帮助

ķ