当我在引号或混合数据中加数字时,如何正确确定数据类型?

问题描述

我知道这是一个非常简单的问题,但是我不能再进一步了。我想将数据从csv文件导入PostgreSQL。我已经创建了一个表,一个名称列,因为它们在文件中被命名,我遇到的第一个问题是我不知道数据类型。我的意思是在我打开CSV文件时在第一栏中有这样的内容:

"COLUMN1";"COLUMN2";"COLUMN3";"COLUMN4"
"009910";NA;NA;"FALSE"
"953308";0;41;"TRUE"
"936540";NA;NA;"FALSE"
"902346";1;5;"TRUE"
"747665";NA;NA;"FALSE"
"074554";NA;NA;"FALSE"
"154572";NA;NA;"FALSE"

当我通过pgAdmin 4导入此库时,其返回错误为数据类型。我将column2设置为Integer,但有点“混合”。我也将列1设置为整数,但数字用引号引起来,所以我想知道PostgreSQL是否将其视为字符串。第4列也是一样。如何正确确定每一列的数据类型?

解决方法

在导入过程中,如果可能,它将值转换为列的类型。 例如,如果您执行SELECT 'FALSE'::boolean,它将强制转换并返回falseSELECT '074554'::int也可以正常工作并返回74554

但是裸字符NA会给您带来麻烦。如果打算将这些文件用作null,请尝试在文件上进行查找/替换并将其取出,以使第一行数据具有"009910";;;"FALSE"并查看是否可行。

您还可以将所有列都作为文本,引用NA值,然后导入。

然后创建一个新表,并使用全文本表中的INSERT INTO ... SELECT并根据需要手动进行强制转换或使用CASE来转换类型。

例如,如果您导入到名为raw_data的表中,并且有一个更好的表imports

INSERT INTO imports
SELECT
  column1::int,CASE WHEN column2 = 'NA' THEN null ELSE column2::int END,CASE WHEN column3 = 'NA' THEN null ELSE column3::int END,column4::boolean
FROM
  raw_data

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...