Postgres使用空日期和整数字段复制

时间:2018-03-21 22:10:06

标签: java postgresql jdbc

我有一个java应用程序,它可以通过JDBC连接将数据从可能的大文件传输到postgres RDS。

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

COPY tableName FROM STDIN with (format csv, delimiter E'\u0001', NULL '', QUOTE E'\u0005')

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

如果我将命令修改为

COPY tableName FROM STDIN with (format csv, delimiter E'\u0001', NULL '\N', QUOTE E'\u0005')

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

我在这里看到类似的问题,解决整数字段的空值或日期字段的空值,但不是两者都有,所以我想知道是否有一种方法可以指定null,它将适用于整数和日期字段(或者为不同的数据类型指定多个不同的空字符串的方法)

我真的想使用COPY,因为性能比解析文件和插入每条记录好得多,所以希望这是可能的

1 个答案:

答案 0 :(得分:4)

使用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));