语法格式
case [列名] when [可能值1] then [目标值1]
when [可能值2] then [目标值2]
...
else [缺省值] end
注意的点
- else最好写上
- end必须写
- when后面的和then后面的值类型必须相同
练习
- 有一张日本的都道府郡表,包含编号,都道府郡名称,以及对应的人口数。输出每个岛的总人数。
+----+----------------+------------+
| ID | PrefectureName | Population |
+----+----------------+------------+
| 1 | 北海道 | 5,800,000 |
| 2 | 青森県 | 1,300,000 |
| 3 | 岩手県 | 1,250,000 |
| 4 | 宮城県 | 2,300,000 |
| 5 | 秋田県 | 1,000,000 |
| 6 | 山形県 | 1,100,000 |
| 7 | 福島県 | 1,900,000 |
| 8 | 茨城県 | 2,900,000 |
| 9 | 栃木県 | 2,000,000 |
| 10 | 群馬県 | 2,000,000 |
+----+----------------+------------+
在日本,都道府县按照所属的岛屿可以分为以下几个主要岛屿群:
北海道岛(北海道)
本州岛(包括东京都、神奈川县、山梨县、长野县、富山县、石川县、福井县、岐阜县、静冈县、爱知县、三重县、滋贺县、京都府、大阪府、兵库县、奈良县、和歌山县、广岛县、冈山县、山口县等)
四国岛(包括香川县、爱媛县、德岛县、高知县)
九州岛(包括福冈县、佐贺县、长崎县、熊本县、大分县、宫崎县、鹿儿岛县)
琉球群岛(包括冲绳县等)
所以输出为:
+------------+------------+
| 岛屿 | 总人数 |
+------------+------------+
| 北海道岛 | 5,800,000 |
| 本州岛 | 14,450,000 |
+------------+------------+
答案
建表语句
CREATE TABLE JapanesePrefectures (
ID INT PRIMARY KEY,
prefectureName VARCHAR(255),
population INT
);
插表语句
INSERT INTO JapanesePrefectures (ID, prefectureName, population) VALUES
(1, '北海道', 5800000),
(2, '青森県', 1300000),
(3, '岩手県', 1250000),
(4, '宮城県', 2300000),
(5, '秋田県', 1000000),
(6, '山形県', 1100000),
(7, '福島県', 1900000),
(8, '茨城県', 2900000),
(9, '栃木県', 2000000),
(10, '群馬県', 2000000);
查询语句
select case prefectureName when '北海道' then '北海道岛'
when '青森県' then '本州岛'
when '岩手県' then '本州岛'
...
else '其他' end as island, sum(population) from JapanesePrefectures
group by island;
说明:这里要理解group by island,是我们经过case语句后处理的列值。
这个语句甚至可以这么写
select case prefectureName when '北海道' then '北海道岛'
when '青森県' then '本州岛'
when '岩手県' then '本州岛'
...
else '其他' end as island, sum(population) from JapanesePrefectures
group by case prefectureName when '北海道' then '北海道岛'
when '青森県' then '本州岛'
when '岩手県' then '本州岛'
...
else '其他' end;
我原本以为group by后面只能是字段名,其实也可以是case语句块。