我目前对数据准备感兴趣,但是我正在使用的SQL脚本有一些麻烦。
我找到了一个.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');
我希望有人能帮助我。
答案 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
而是使用不需要双引号的合法标识符:c2016
,c2015
,...