如何从平面文件中删除列的值,或者从oracle表中的平面文件加载数据时将列替换为其他值

时间:2018-03-29 10:09:37

标签: oracle sql-loader

我有一个临时表,现在是空的。我想将该平面文件中的数据加载到oracle临时表。在平面文件的一列 col3 中提及“ X ”,但在表格中我想插入“ abc ”。如果可以从平面文件中的“ X ”中删除列值,那么它是如何实现的?或者将“ X ”中的值替换为“ abc ”。

2 个答案:

答案 0 :(得分:1)

SQL * Loader允许您apply SQL operators to fields,因此您可以操作文件中的值。

我们假设您有一个简单的表格,如:

create table your_table(col1 number, col2 number, col3 varchar2(3));

和一个数据文件,如:

1,42,xyz
2,42,
3,42,X

然后你可以让你的控制文件取代' X' col3中的值为固定值' abc'使用案例表达式:

load data
replace
into table your_table
fields terminated by ',' optionally enclosed by '"'
trailing nullcols
(
  col1,
  col2,
  col3 "CASE WHEN :COL3 = 'X' THEN 'abc' ELSE :COL3 END"
)

使用该控制文件运行该文件会插入三行:

select * from your_table;

      COL1       COL2 COL
---------- ---------- ---
         1         42 xyz
         2         42    
         3         42 abc

' X'已被替换,其他值保留。

如果你想删除'值,而不是替换它,你可以做同样的事情,但使用null作为固定值:

  col3 "CASE WHEN :COL3 = 'X' THEN NULL ELSE :COL3 END"

或者您可以使用nullif or defaultif

  col3 nullif(col3 = 'X')

答案 1 :(得分:1)

DECODE,对吧?

SQL> create table test (id number, col3 varchar2(20));

Table created.

SQL> $type test25.ctl
load data
infile *
replace into table test
fields terminated by ',' trailing nullcols
(
id,
col3 "decode(:col3, 'x', 'abc', :col3)"
)
begindata
1,xxx
2,yyy
3,x
4,123
SQL>
SQL> $sqlldr scott/tiger@orcl control=test25.ctl log=test25.log

SQL*Loader: Release 11.2.0.2.0 - Production on ╚et O×u 29 12:57:56 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 3
Commit point reached - logical record count 4

SQL> select * From test order by id;

        ID COL3
---------- --------------------
         1 xxx
         2 yyy
         3 abc
         4 123

SQL>