Postgresql 在从CSV复制操作期间,无法将破折号替换为null
我有以下CSV数据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
"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