首页 > 解决方案 > 数据准备 - 替换表格大部分列中的数字和符号

问题描述

我目前对数据准备感兴趣,但我正在处理的 SQL 脚本遇到了一些问题。

我发现了一个 .csv 文件,其中包含有关犯罪率的统计信息,您可以在此处看到:

.csv 文件的屏幕截图

现在我想对从2016到的列进行一些更改2008。所有数字都应更改为 1,所有冒号应更改为 0,以便进一步准备和数据分析过程。我决定VARCHAR用作列的数据类型。因此,我可以将冒号更改为 0,但现在我无法将数字更改为 1。这是目前的脚本:

DROP TABLE IF EXISTS crime;
CREATE TABLE crime (
id SERIAL,
age VARCHAR,
sex CHAR(1), 
unit VARCHAR,
geo VARCHAR,
"2016" VARCHAR, 
"2015" VARCHAR,
"2014" VARCHAR, 
"2013" VARCHAR,
"2012" VARCHAR, 
"2011" VARCHAR,
"2010" VARCHAR, 
"2009" VARCHAR,
"2008" VARCHAR,
PRIMARY KEY (id)
);

\unset ON_ERROR_STOP

COPY crime(age, sex, unit, geo, "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008") 
FROM 'path' 
delimiter ';' CSV HEADER;

ALTER TABLE crime DROP COLUMN IF EXISTS unit, DROP COLUMN IF EXISTS age;

UPDATE crime SET "2016" = REPLACE("2016", ':', '0'),
"2015" = REPLACE("2015", ':', '0'), 
"2014" = REPLACE("2014", ':', '0'), 
"2013" = REPLACE("2013", ':', '0'), 
"2012" = REPLACE("2012", ':', '0'), 
"2011" = REPLACE("2011", ':', '0'), 
"2010" = REPLACE("2010", ':', '0'), 
"2009" = REPLACE("2009", ':', '0'), 
"2008" = REPLACE("2008", ':', '0');

我希望有一个人可以帮助我。

标签: sqlpostgresqltypessql-updatedata-analysis

解决方案


如果这只是数字或:如您的屏幕截图所示:

UPDATE crime
SET    "2016" = CASE WHEN "2016" = ':' THEN 0 ELSE 1 END
     , "2015" = CASE WHEN "2015" = ':' THEN 0 ELSE 1 END
  -- , ...
     , "2008" = CASE WHEN "2008" = ':' THEN 0 ELSE 1 END;

如果您只关心 0 和 1,请考虑将结果转换为boolean之后:

ALTER TABLE crime 
  ALTER "2016" TYPE bool USING "2016"::bool
, ALTER "2015" TYPE bool USING "2015"::bool
-- , ...
, ALTER "2008" TYPE bool USING "2008"::bool;

0-> FALSE
1->TRUE

而是使用不需要双引号的合法标识符:c2016, c2015, ...


推荐阅读