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