外部表numeric列包含空值如何插入到本地表

本文介绍在从Oracle导出包含空字符的表至PostgreSQL时遇到的问题及解决方法。由于空字符串与NULL值不等,导致数据类型冲突。通过创建外部表,使用varchar类型替代numeric,再通过case when语句转换为空值,最后修改数据类型为numeric或timestamp。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

环境

症状

问题原因

解决方案

环境

系统平台: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;

更多详细信息请登录【瀚高技术支持平台】查看瀚高技术支持平台 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值