保亭黎族苗族自治县网站建设_网站建设公司_外包开发_seo优化
2025/12/24 17:14:17 网站建设 项目流程

文章目录

  • 环境
  • 症状
  • 问题原因
  • 解决方案

环境

系统平台: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类型代替

createforeigntablef2wbb_time(idint,nametext,fgvarchar(8),agevarchar,time_otext)server pg_file_server options(filename'/home/postgres/wbb_time.csv',format'csv',header'true',delimiter',');

2、从外部表插入到本地表

selectid,name,casewhenage=''thenNULLelseageend::realasage,time_ointob2wbb_timefromf2wbb_time;

3、修改本地表列数据类型

altertableb2wbb_timealtercolumnagetypenumeric;altertableb2wbb_timealterCOLUMNtime_otypetimestampUSINGtime_o::timestampwithouttimezone;

4、查询数据

cqsm=# select * from b2wbb_time ;id|name|age|time_o----+--------+---------+---------------------1|highgo|1|2019-09-2101:32:001|highgo|1|2019-09-2101:32:002|highgo||2019-09-2101:32:00(3rows)cqsm=# \d b2wbb_timeTable"public.b2wbb_time"Column|Type|Modifiers---------+-----------------------------+-----------id|integer|name|text|age|numeric|time_o|timestampwithouttimezone|

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询