具有多个空可能性的 Postgres COPY
Postgres COPY With Multiple Null Possibilities
我正在使用 SQL 命令将一个 CSV 文件复制到 Postgres 中,该文件有两种不同的可能性,我希望将其视为 null。第一个只是一个空白(两个连续的逗号)。第二个是字符串“PrivacySuppressed”。
我试过像这样导入 CSV:
COPY c2c.field FROM 'my_csv.csv' NULL AS 'PrivacySuppressed' HEADER csv;
这里的问题是,虽然PrivacySuppressed被转为null,但是把blank当成了空字符串,报错如下:
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
我正在使用 SQL 命令将一个 CSV 文件复制到 Postgres 中,该文件有两种不同的可能性,我希望将其视为 null。第一个只是一个空白(两个连续的逗号)。第二个是字符串“PrivacySuppressed”。
我试过像这样导入 CSV:
COPY c2c.field FROM 'my_csv.csv' NULL AS 'PrivacySuppressed' HEADER csv;
这里的问题是,虽然PrivacySuppressed被转为null,但是把blank当成了空字符串,报错如下:
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