sql - 数据准备 - 替换表格大部分列中的数字和符号
问题描述
我目前对数据准备感兴趣,但我正在处理的 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');
我希望有一个人可以帮助我。
解决方案
如果这只是数字或:
如您的屏幕截图所示:
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
, ...
推荐阅读
- docker - 在使用非 root 用户运行容器时在主机上安装卷时出现问题
- html - 在 html 和 css 中圈出一个 div
- c++ - 从 OnThreadCreate 调用 CoCreateInstance 时挂起
- python - 如何使用 apply(lambda) 和 all 优化此代码中的循环。示例?
- linux - sed - 用字符串替换以 A 开头并以 B 结尾的段落
- h2 - 如何减少右连接查询的执行时间?
- xaml - 首次绘制控件后,Xamarin.Forms ControlTemplate 绑定失败
- c++ - 为什么 puts() 在仅对某些值使用指针时有一个随机尾随字符
- c++ - C++:推断模板函数的类型时出错
- python - 无效的 Unicode 转义序列 '\u8def6515'; 最多应该是 '\u0010FFFF'