我正在使用SQL命令将CSV文件复制到Postgres中,该文件有两种不同的可能性,我想将其视为null。第一个只是一个空白(两个连续的逗号(。第二个是字符串";PrivacySuppressed";。
我尝试过导入CSV,如下所示:
COPY c2c.field FROM 'my_csv.csv' NULL AS 'PrivacySuppressed' HEADER csv;
这里的问题是,尽管PrivacySuppressed被转换为null,但空白被视为空白字符串,我得到了以下错误:
ERROR: invalid input syntax for type integer: ""
如何导入这样一个具有多种NULL可能性的CSV?我可以通过剥离PrivacySuppressed字符串来修改原始CSV,但我希望将其保留在数据中(这样,如果我们决定更改应用程序,我们仍然可以访问它(。
一个例子:
cat csv_null_test.csv
1,,9
2,"19","5"
3,"PrivacySuppressed","5"
4,"19","15"
5,"19","5"
create table csv_null_test(id integer, fld_1 varchar, fld_2 integer);
copy csv_null_test from 'csv_null_test.csv' with(format 'csv');
COPY 5
pset null
Null display is "NULL".
select * from csv_null_test ;
id | fld_1 | fld_2
----+-------------------+-------
1 | NULL | 9
2 | 19 | 5
3 | PrivacySuppressed | 5
4 | 19 | 15
5 | 19 | 5
(5 rows)
update csv_null_test set fld_1 = nullif(fld_1, 'PrivacySuppressed') where fld_1 = 'PrivacySuppressed' ;
UPDATE 1
select * from csv_null_test ;
id | fld_1 | fld_2
----+-------+-------
1 | NULL | 9
2 | 19 | 5
4 | 19 | 15
5 | 19 | 5
3 | NULL | 5