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

How to determine properly data types when I have number in quotes or mixed data?

我知道这是非常简单的问题,但我不能再进一步了。我想将数据从 csv 文件导入到 PostgreSQL。我创建了一个 table,名称列,因为它们在文件中被命名,我遇到的第一个问题是我不知道数据类型。我的意思是,当我打开 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 导入这个基础时,它的 return 数据类型错误。我将 column2 设置为整数,但有点 'mixed'。第 1 列我也设置为整数,但数字在引号中,所以我想知道 PostgreSQL 是否将其视为字符串。 column4 也是如此。如何正确判断每一列的数据类型?

在导入过程中,如果可能,它会将值转换为列的类型。 例如,如果您执行 SELECT 'FALSE'::boolean,它将投射 return falseSELECT '074554'::int 也适用,returns 74554.

但是裸字符NA会给你带来麻烦。如果这些是 null,请尝试对文件执行 find/replace 并将它们取出,以便第一行数据具有 "009910";;;"FALSE" 并查看是否有效。

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

然后创建一个新的table,并使用all-texttable中的INSERT INTO ... SELECT并根据需要手动转换或使用CASE来转换类型。

例如,如果您导入一个名为 raw_data 的 table,并且有一个更好的 table 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