PostgreSQL导入CSV时numeric空串转NULL的命令需求及解决方法
解决PostgreSQL导入CSV时numeric列空串报错的问题
方法1:用COPY命令直接映射空串为NULL
这是最简便的处理方式,利用PostgreSQL的COPY命令自带参数,指定空字符串(或空格串)作为NULL的标识:
-- 若空串是无空格的"",使用该命令 COPY your_table_name FROM '/path/to/your/file.csv' WITH (FORMAT csv, NULL '', DELIMITER ',', HEADER); -- 若空串是带空格的" ",将NULL参数改为空格 COPY your_table_name FROM '/path/to/your/file.csv' WITH (FORMAT csv, NULL ' ', DELIMITER ',', HEADER);
导入时PostgreSQL会自动把指定的空值标识转换成NULL,适配numeric类型的非空串要求。
方法2:INSERT时用函数转换空串
如果是通过INSERT语句逐行插入数据,对目标numeric列使用NULLIF函数做转换:
INSERT INTO your_table_name (col1, target_numeric_col, col3) VALUES ('example_val1', NULLIF(' ', ''), 'val3'), ('example_val2', NULLIF('', ''), 'val4');
NULLIF(a, b)函数会在a等于b时返回NULL,否则返回a,刚好把空串/空格串转换成numeric列可接受的NULL值。
方法3:预处理CSV文件
如果不想修改SQL命令,可以先把CSV里的空字段替换成PostgreSQL默认的NULL标识\N,用shell命令快速处理:
sed -i 's/^,/\\N,/g; s/,,/,\\N,/g; s/,$/,\\N/g' your_file.csv
该命令会处理CSV开头、中间、结尾的空字段,替换完成后用常规COPY命令导入即可。
内容的提问来源于stack exchange,提问作者Ravi Chandran
相关产品推荐
相关产品推荐

