目录
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:4.7.7,4.7.6,4.7.5,4.3.2,4.1.1
症状
从Oracle中导出的表中包含许多空字符,但数据类型是numeric或timestamp,查询外部表和插入本地表会报错,信息如下:
cqsm=# select * from fwbb_time ; --fwbb_time是外部表 ERROR: invalid input syntax for type numeric: "" CONTEXT: COPY fwbb_time, line 4, column age: "" STATEMENT: select * from fwbb_time ; ERROR: invalid input syntax for type numeric: "" CONTEXT: COPY fwbb_time, line 4, column age: "" |
问题原因
在HGDB中空字符串与NULL值并不相等,所以会造成numeric=''的错误语义
解决方案
解决的方法有很多,如果只是一张单表且数据量不大可以使用case when语句来处理(此种方法仍可以保证空值不被转换,适用于特殊场景),方法如下:
1、创建外部表,将numeric列先用varchar类型代替
create foreign table f2wbb_time(id int,name text,fg varchar(8),age varchar,time_o text) server pg_file_server options(filename '/home/postgres/wbb_time.csv',format 'csv',header 'true',delimiter ','); |
2、从外部表插入到本地表
select id,name,case when age='' then NULL else age end::real as age , time_o into b2wbb_time from f2wbb_time; |
3、修改本地表列数据类型
alter table b2wbb_time alter column age type numeric; alter table b2wbb_time alter COLUMN time_o type timestamp USING time_o::timestamp without time zone; |
更多详细信息请登录【瀚高技术支持平台】查看瀚高技术支持平台