Postgresql 在从CSV复制操作期间,无法将破折号替换为null

Postgresql 在从CSV复制操作期间,无法将破折号替换为null,postgresql,Postgresql,我有以下CSV数据 "AG","Saint Philip","AG-08" "AI","Anguilla","-" "AL","Berat","AL-01" 我想将-替换为NULL 我使用以下命令 copy subdivision from '/tmp/IP2LOCATION-ISO3166-2.CSV' with

我有以下CSV数据

"AG","Saint Philip","AG-08"
"AI","Anguilla","-"
"AL","Berat","AL-01"
我想将
-
替换为
NULL

我使用以下命令

copy subdivision from '/tmp/IP2LOCATION-ISO3166-2.CSV' with delimiter as ',' NULL AS '-' csv;
复制操作成功。但是,第3列中的
-
也将被复制,而不是替换为
NULL

你知道我的命令有什么错误吗?我的桌子是空的

CREATE TABLE subdivision(
    country_code TEXT NOT NULL,
    name TEXT NOT NULL,
    code TEXT
);

归根结底是引用。如果您有:

"AI","Anguilla",-
"AL","Berat","AL-01"
然后,下面的工作(使用较新的
复制
格式):

如果您保持原始csv:

"AG","Saint Philip","AG-08"
"AI","Anguilla","-"
"AL","Berat","AL-01"
那么你必须这样做:

copy 
   subdivision 
from 
   '/home/postgres/csv_test.csv' 
with(format csv, delimiter  ',' , NULL '-', FORCE_NULL (code) );

select * from subdivision ;
 country_code |     name     | code  
--------------+--------------+-------
 AG           | Saint Philip | AG-08
 AI           | Anguilla     | NULL
 AL           | Berat        | AL-01

其中
FORCE_NULL
为:

强制无效

将指定列的值与空字符串匹配,即使该字符串已被引用,并且如果找到匹配项,请将该值设置为空。在空字符串为空的默认情况下,这会将带引号的空字符串转换为空字符串。仅在“复制自”中以及仅在使用CSV格式时才允许使用此选项

因此,要转换带引号的值,必须通过指定列来强制转换

copy 
   subdivision 
from 
   '/home/postgres/csv_test.csv' 
with(format csv, delimiter  ',' , NULL '-', FORCE_NULL (code) );

select * from subdivision ;
 country_code |     name     | code  
--------------+--------------+-------
 AG           | Saint Philip | AG-08
 AI           | Anguilla     | NULL
 AL           | Berat        | AL-01