前提
root@f6f006004a3a:/# psql -U postgres
psql (13.3 (Debian 13.3-1.pgdg100+1))
CSVファイル
test.csv
root@f6f006004a3a:/# cat test.csv
"Bob","123"
"Tom",""
テーブル定義
postgres=# create table test(name varchar(50), saraly numeric);
CREATE TABLE
エラーになるパターン
postgres=# copy test from '/test.csv' with (format csv, null '');
ERROR: invalid input syntax for type numeric: ""
CONTEXT: COPY test, line 2, column saraly: ""
postgres=#
空文字はnullとして扱うよう、「null ''」を指定しているのに、numericに空文字はダメという感じのエラーが出る。
正常パターン
postgres=# copy test from '/test.csv' with (format csv, null '', force_null(saraly));
COPY 2
postgres=# select * from test;
name | saraly
------+--------
Bob | 123
Tom |
(2 rows)
postgres=# select * from test where saraly is null;
name | saraly
------+--------
Tom |
(1 row)
postgres=#
saralyカラムをforce_null指定することで、正常にCSVファイルをテーブルデータに登録できました。force_nullのオプション名から、全ての行でnullになってしまうかも?という疑惑もありましたが、CSVファイル上空文字になっていない行については、正しく値が入ってます。