具有空日期和整数字段的Postgres复制

nLe*_*Lee 1 java postgresql jdbc

我有一个Java应用程序,它通过JDBC连接将可能是大文件的数据流传输到Postgres RDS中。

我正在使用以下命令,该命令适用于空整数类型。

COPY tableName FROM STDIN with (format csv, delimiter E'\u0001', NULL '', QUOTE E'\u0005')
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于空日期字段(PSQLException:错误:日期的无效输入语法:“”)

如果我将命令修改为

COPY tableName FROM STDIN with (format csv, delimiter E'\u0001', NULL '\N', QUOTE E'\u0005')
Run Code Online (Sandbox Code Playgroud)

它适用于日期字段,但不适用于整数字段。(PSQLException:错误:整数的无效输入语法:“ \ N”)

我在这里看到过类似的问题,要么针对整数字段使用null,要么针对日期字段使用null,但不能同时解决这两个问题,所以我想知道是否有一种方法可以指定同时适用于整数字段和日期字段的null(或一种方法)。为不同的数据类型指定多个不同的空字符串)

我真的很想使用COPY,因为它的性能比解析文件并插入每条记录要好得多,所以希望有可能

nLe*_*Lee 5

因此,对于Postgres 9.4+,可以使用FORCE_NULL实现

根据文档

将指定列的值与空字符串进行匹配,即使已将其引号引起来,并且如果找到匹配项,请将其值设置为NULL。在空字符串为空的默认情况下,这会将带引号的空字符串转换为NULL。仅在COPY FROM中和使用CSV格式时才允许使用此选项。

因此,我修改后的SQL如下:

COPY tableName FROM STDIN with (format csv, delimiter E'\u0001', null '', quote E'\u0005', force_null(dateField1, dateField2,...,dateFieldN)); 
Run Code Online (Sandbox Code Playgroud)