数据准备-替换表格中大多数列中的数字和符号

时间:2019-02-27 20:36:57

标签: sql postgresql types sql-update data-analysis

我目前对数据准备感兴趣,但是我正在使用的SQL脚本有一些麻烦。

我找到了一个.csv文件,其中包含犯罪率的统计信息,如您所见:

Screenshot of the .csv file

现在,我想在从20162008的列中进行一些更改。所有数字都应更改为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');

我希望有人能帮助我。

1 个答案:

答案 0 :(得分:0)

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

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

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