如何从平面文件中删除列的值或用其他值替换列,同时从 Oracle 表中的平面文件加载数据
How to remove value of the column from flat files or replace column with some other value while load data from flat files in oracle tables
我有一个临时 table 现在是空的。我想将该平面文件中的数据加载到 oracle temp table。在平面文件的一列 col3 中提到为“X”,但在 table 中我想插入为“abc”。如果可以从平面文件中的“X”中删除列值,那怎么可能呢?或将值从“X”替换为“abc”。
SQL*Loader 允许您 apply SQL operators to fields,因此您可以操作文件中的值。
假设您有一个简单的 table,例如:
create table your_table(col1 number, col2 number, col3 varchar2(3));
和一个数据文件,如:
1,42,xyz
2,42,
3,42,X
然后您可以让您的控制文件使用 case 表达式将 col3
中的 'X' 值替换为固定值 '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'已被替换,其他值保留。
如果你想 'remove' 这个值,而不是替换它,你可以做同样的事情,但使用 null 作为固定值:
col3 "CASE WHEN :COL3 = 'X' THEN NULL ELSE :COL3 END"
或者您可以使用 nullif
or defaultif
:
col3 nullif(col3 = 'X')
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>
我有一个临时 table 现在是空的。我想将该平面文件中的数据加载到 oracle temp table。在平面文件的一列 col3 中提到为“X”,但在 table 中我想插入为“abc”。如果可以从平面文件中的“X”中删除列值,那怎么可能呢?或将值从“X”替换为“abc”。
SQL*Loader 允许您 apply SQL operators to fields,因此您可以操作文件中的值。
假设您有一个简单的 table,例如:
create table your_table(col1 number, col2 number, col3 varchar2(3));
和一个数据文件,如:
1,42,xyz
2,42,
3,42,X
然后您可以让您的控制文件使用 case 表达式将 col3
中的 'X' 值替换为固定值 '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'已被替换,其他值保留。
如果你想 'remove' 这个值,而不是替换它,你可以做同样的事情,但使用 null 作为固定值:
col3 "CASE WHEN :COL3 = 'X' THEN NULL ELSE :COL3 END"
或者您可以使用 nullif
or defaultif
:
col3 nullif(col3 = 'X')
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>