SQL:怎么样使用连字符和逗号来改变列值?
问:将所有数据导入表的时候如何解码?例如,我有一个.CSV 文件,有两个列,例如:
Name Address
selva addr1-addr2-addr3
joy asd1-asd2-asd3
当我使用SQL loader 来加载数据到表的时候,我需要一个CTL 文件。我怎么才能将这个日期解码为连字符或者逗号分割的列值呢?
答:控制文件中的INSERT, APPEND, REPLACE, TRUNCATE 对应数据库中的指令:
1、 在一个已经空的表中插入行;当表非空的时候,这个操作失败。
2、 在非空表中插入行。
3、 替换或者截断表中的行,并且在数据文件或者控制文件中插入数据。数据可以作为控制文件的一部分通过语句BEGINDATA 来优先插入。
为了反便你用连字符来替换表中行的逗号,你需要创建一个插入之前的触发器,如下所示:
表称为TEST,具有如下的描述:
NAME VARCHAR2(100)
ADDRESS VARCHAR2(200)
触发器内容如下,可以帮助你达到目标:
CREATE OR REPLACE TRIGGER REPLACE_DASHES_WITH_COLUMN
BEFORE INSERT ON TEST
FOR EACH ROW
BEGIN
:NEW.ADDRESS := REPLACE(:NEW.ADDRESS,'-', ',');
END;
/
控制文件(test.ctl) 列表如下:
LOAD DATA
INFILE *
INTO TABLE TEST
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(NAME, ADDRESS)
BEGINDATA
Sonali Bendre, c/o Azim Fahmi-Somewhere outthere-Bollywood
Preity Zinta, "c/o Azim Fahmi-In your dreams-None of your business"
"George Bush", 1600 Pennsylvania Avenue-Whitehouse-Washington D.C.
Tony Blair, 10 Downing Street-London-UK-POSTALCODE HERE
Telaram Thakur, 10 Shabzi Mandi-Jackson Heights-New York
如果你在命令行中输入一下的命令:
sqlldr USERID=/{@db_name} control=test.ctl log=test.log bad=test.bad
where @db_name is optional
短横线就可以被逗号替代因为在用户触发之前就被编译了。