【问题标题】:Postgres Copy with null date and integer fields带有空日期和整数字段的 Postgres 复制
【发布时间】:2018-03-21 22:10:05
【问题描述】:

我有一个 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”)

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

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

【问题讨论】:

  • @VaoTsun,感谢您的回复。我找到了另一个解决方案,我在下面给出了答案

标签: java postgresql jdbc


【解决方案1】:

所以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)); 

【讨论】:

  • 非常感谢!找了好久的答案!我的代码:copy TableName(place_id,osm_type,problem_column) FROM 'D:\File.csv' WITH (format csv, DELIMITER ';', header true, force_null (problem_column), ENCODING 'UTF8' );
  • UPD 它适用于 postgresql 版本 11。在this page底部查看其他版本select version();
猜你喜欢
  • 2019-12-29
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多