我有一个4列的临时表
CREATE TEMP TABLE tmp_import (
a varchar(128),
b varchar,
c varchar(256),
d integer default null
) ON COMMIT DROP
字符串
我想复制数据从一个csv文件到这个临时表与命令
COPY tmp_import FROM STDIN WITH ( DELIMITER ';', FORMAT 'csv', ENCODING 'UTF-8', HEADER 'true')
型
CSV文件头可能有3或4列,如a;B;c;d或a;B;c,d列是可选的。如下所示;
a;b;c;d
31641212545;2021-01-01 11:00:00;http://www.google.nl;1
31641342545;2021-01-01 11:00:00;http://www.google.nl;1
31641310545;2021-01-01 11:00:00;http://www.google.nl;1
31641300545;2021-01-01 11:00:00;http://www.google.nl;1
型
或
a;b;c
31641212545;2021-01-01 11:00:00;http://www.google.nl
31641342545;2021-01-01 11:00:00;http://www.google.nl
31641310545;2021-01-01 11:00:00;http://www.google.nl
31641300545;2021-01-01 11:00:00;http://www.google.nl
型
COPY命令运行4个头的CSV文件,但运行3个头时失败。
引发的异常
org.postgresql.util.PSQLException: ERROR: missing data for column "d"
Where: COPY tmp_import, line 2: "123456;2021-01-01 11:00:00;http://www.google.nl"
型
如何修复此查询或命令以支持3和4个头,并为缺少可选的d头插入null?
2条答案
按热度按时间li9yvcax1#
您不能用一个命令同时处理这两种情况,但是您可以指示它分别处理第二种情况:demo
字符串
| 一|B| C| D|
| --|--|--|--|
| A1| B1| C1| 1 |
请注意表名后面的显式列名列表:
型
| 一|B| C| D|
| --|--|--|--|
| A1| B1| C1| 1 |
| A2| B2| C2| * 空 *|
你可以通过捕捉异常来切换:
型
o7jaxewo2#
如果CSV文件的列比表少,则必须指定列列表,如
字符串
由于您可能无法提前知道文件的外观,因此可以按以下步骤操作:
COPY
语句加载文件COPY
语句