当我在引号或混合数据中有数字时如何正确确定数据类型?
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 false
。 SELECT '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
我知道这是非常简单的问题,但我不能再进一步了。我想将数据从 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 false
。 SELECT '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