我有一个 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: ERROR: invalid input syntax for integer: "\N")
我在这里看到了类似的问题,解决了整数字段的空值或日期字段的空值,但不是两者,所以我想知道是否有一种方法可以指定 null 来处理整数和日期字段(或为不同数据类型指定多个不同空字符串的方法)
我真的很想使用 COPY,因为性能比解析文件和插入每条记录要好得多,所以希望这是可能的
最佳答案
所以 Postgres 9.4+这可以使用 FORCE_NULL 实现
基于文档
Match the specified columns' values against the null string, even if it has been quoted, and if a match is found set the value to NULL. In the default case where the null string is empty, this converts a quoted empty string into NULL. This option is allowed only in COPY FROM, and only when using CSV format.
所以我修改后的SQL如下:
COPY tableName FROM STDIN with (format csv, delimiter E'\u0001', null '', quote E'\u0005', force_null(dateField1, dateField2,...,dateFieldN));
关于java - 具有空日期和整数字段的 Postgres 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49417348/