SQLite 的 CASE
表达式会根据给定的条件计算结果,并把计算结果返回成一个指定的列。CASE
表达式类似于 IF-THEN-ELSE
这类语法。
您可以在任何语句中使用 CASE
表达式。如:WHERE
,ORDER BY
,HAVING
,SELECT
语句,也可以在 SELECT
,UPDATE
和 DELETE
使用。
SQLite 提供了两种形式的 CASE
表达式:简单模式 CASE
和搜索模式 CASE
。
简单模式 CASE
简单模式 CASE
表达式将需要比较的项目与一个表达式列表进行比较以返回结果。以下是简单 CASE
表达式的语法:
CASE case_expression
WHEN when_expression_1 THEN result_1
WHEN when_expression_2 THEN result_2
...
[ ELSE result_else ]
END
我们来看一个实例,假设有这样一张 customer
表。
ID | NAME | COUNTRY |
---|---|---|
1 | Tom | USA |
2 | Wang | China |
3 | Ono | Japan |
4 | Tony | UK |
5 | Lin | China |
我打算用一个表达式把客户根据国籍来分类,China 的标记为国内 Domestic
,其它的标记为 Foreign
。
表达式如下:
SELECT ID, NAME, COUNTRY,
CASE COUNTRY
WHEN 'China' THEN 'Domestic'
ELSE 'Foreign'
END CustomerGroup
FROM customer
ORDER BY CustomerGroup;
执行后得到的新表:
ID | NAME | COUNTRY | CustomerGroup |
---|---|---|---|
2 | Wang | China | Domestic |
5 | Lin | China | Domestic |
1 | Tom | USA | Foreign |
3 | Ono | Japan | Foreign |
4 | Tony | UK | Foreign |
搜索模式 CASE
简单模型下的 CASE
只会和表达式列表给定的值作是否相等的比较,搜索模式的 CASE
则允许使用更复杂的运算符号。
看个例子,有一张 student
表,我打算按分数来确定学生的等级。
ID | NAME | SCORE |
---|---|---|
1 | Tom | 80 |
2 | Wang | 60 |
3 | Ono | 50 |
4 | Tony | 90 |
5 | Lin | 70 |
表达式如下:
SELECT ID, NAME, SCORE,
CASE
WHEN SCORE >= 80 THEN 'A'
WHEN SCORE < 80 AND SCORE >= 60 THEN 'B'
ELSE 'C'
END level
FROM student
ORDER BY level;
得到一张新表:
ID | NAME | SCORE | level |
---|---|---|---|
1 | Tom | 80 | A |
4 | Tony | 90 | A |
2 | Wang | 60 | B |
5 | Lin | 70 | B |
3 | Ono | 50 | C |
使用 CASE 自定义排序
CASE
子句的另一个有趣的用法就是用来自定义排序。
假设有一张学生表,我想把学生等级按 “甲、乙、丙、丁” 的顺序来排序。
ID | NAME | level |
---|---|---|
1 | Tom | 丙 |
2 | Wang | 甲 |
3 | Ono | 丁 |
4 | Tony | 乙 |
直接使用 ORDER BY
语句显然不行,这里我们用 CASE
语句来生成一个新列来辅助排序。
SELECT ID, NAME, level FROM student
ORDER BY
CASE level
WHEN '甲' THEN 1
WHEN '乙' THEN 2
WHEN '丙' THEN 3
WHEN '丁' THEN 4
END;
这样我们就得自定义顺序的新表。
网友评论