CASE 子句

SQLite 的 CASE 表达式会根据给定的条件计算结果,并把计算结果返回成一个指定的列。CASE 表达式类似于 IF-THEN-ELSE 这类语法。

您可以在任何语句中使用 CASE 表达式。如:WHEREORDER BYHAVINGSELECT 语句,也可以在 SELECTUPDATEDELETE 使用。

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;

这样我们就得自定义顺序的新表。

你可能感兴趣的:(CASE 子句)