我有一个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,因为性能比解析文件和插入每条记录好得多,所以希望这是可能的
答案 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));