首先我们来创建一组测试数据用来学习CASE表达式,代码如下:
CREATE TABLE student(
s_id varchar(50) NOT NULL PRIMARY KEY,
s_name varchar(50),
s_gender varchar(50),
s_age int
)
INSERT INTO student(s_id,s_name,s_gender,s_age) VALUES ('S101','Tom','male',18);
INSERT INTO student(s_id,s_name,s_gender,s_age) VALUES ('S102','Lucy','female',18);
INSERT INTO student(s_id,s_name,s_gender,s_age) VALUES ('S103','Jack','male',19);
INSERT INTO student(s_id,s_name,s_gender,s_age) VALUES ('S104','Bruce','male',16);
INSERT INTO student(s_id,s_name,s_gender,s_age) VALUES ('S105','Jayce','male',23);
计算条件列表,并返回多个可能的结果表达式之一,CASE表达式就像是Java语言中的switch…case语法一样,CASE表达式就是当满足某条WHEN后的条件表达式时返回它后面结果表达式
CASE表达式有以下两种格式:
基本语法如下:
-- 简单的CASE表达式:
SELECT
CASE input_expression
WHEN when_expression THEN result_expression
WHEN when_expression THEN result_expression
...
ELSE else_result_expression END
FROM
databasename.dbo.tablename
-- CASE搜索表达式:
SELECT
CASE
WHEN boolean_expression THEN result_expression
WHEN boolean_expression THEN result_expression
...
ELSE else_result_expression END
FROM
databasename.dbo.tablename
注释:
(1)参数
input_expression: 使用简单的case格式时计算的表达式,input_expression是任何有效的表达式
WHEN when_expression: 使用简单的case格式时要与input_expression进行比较的简单表达式。when_expression是任何有效的表达式,input_expression及每个when_expression的数据类型必须相同或必须是隐式转换的数据类型
THEN result_expression: 当input_expression=when_expression的计算结果为true时,或boolean_expression的计算结果为true时返回的表达式,result_expression是任何有效的表达式
ELSE else_result_expression: 比较运算计算结果不为true时返回的表达式,如果忽略此参数且比较运算计算结果不为true,则CASE返回null,else_result_expression是任何有效的表达式,else_result_expression及任何result_expression的数据类型必须相同或必须是隐式转换的数据类型
WHEN boolean_expression: 使用CASE搜索格式时所计算的布尔表达式,boolean_expression是任何有效的布尔表达式
(2)返回类型
CASE简单表达式:
CASE简单表达式的工作方式如下:将第一个表达式与每个WHEN子句中的表达式进行比较,以确定它们是否等效,如果这些表达式等效,将返回then子句中的表达式
仅用于等同性检查
按指定的顺序计算每个 when 子句的 input_expression = when_expression
返回首个 input_expression = when_expression 的计算结果为 true 的 result_expression
如果 input_expression = when_expression 的计算结果均不为 true,则在指定了 else 子句的情况下,SQLServer数据库引擎将返回 else_result_expression;若没有指定 else 子句,则返回 null 值
CASE搜索表达式:
按指定顺序对每个 when 子句的 boolean_expression 进行计算
返回首个 boolean_expression 的计算结果为 true 的 result_expression
如果 boolean_expression 的计算结果均不为 true,则在指定了 else 子句的情况下,数据库引擎将返回 else_result_expression;若没有指定 else 子句,则返回 null 值
(3)优缺点
简单case函数注重简洁,但是它只适用于这种单字段的单值比较,而case搜索函数的优点在于适用于所有比较(包括多值比较)的情况
示例一: 下面我们就使用CASE简单表达式来简单实现学生名的中文翻译,代码如下:
SELECT s_id,s_name,'中文名'=
CASE s_name
WHEN 'Tom' THEN '汤姆'
WHEN 'Lucy' THEN '露易丝'
WHEN 'Jack' THEN '杰克'
ELSE '无法识别'
END
,s_gender,s_age
FROM student
执行结果如下:
示例二: 下面我们就使用CASE搜索表达式来简单实现学生是否成年的判断,代码如下:
SELECT s_id,s_name,s_gender,s_age,'是否成年'=
CASE
WHEN s_age>=18 THEN '已成年'
ELSE '未成年'
END
FROM student