SQL中CASE...WHEN语句

SQL查询中可以使用CASE来替换结果的显示,主要有两种使用形式:

  • 语法形式1(个人称之为 switch形式)
case 表达式 
when 表达式 then 表达式
when 表达式 then 表达式
...
[else 表达式]
end

  该语句的执行过程是:将CASE后面表达式的值逐个与各WHEN子句中的表达式的值进行比较,如果两者相等,则返回THEN后的表达式的值,然后跳出CASE语句。如果所有WHEN子句都匹配不到,则返回ELSE子句中的表达式的值。ELSE子句是可选项,当CASE语句中不包含ELSE子句时,CASE语句将返回NULL。

这种方式类似java中的switch语句 else相当于default
语法形式2(个人称之为 if形式)

case 
when 布尔表达式 then 表达式
when 布尔表达式 then 表达式
...
[else 表达式]
end

  该语句的执行过程是:首先测试WHEN后的条件表达式的值,如果其值为真,则返回THEN后面的表达式的值,否则测试下一个WHEN子句中的表达式的值,如果所有WHEN子句后的表达式的值都为假,则返回ELSE后的表达式的值,如果在CASE语句中没有ELSE子句,则CASE表达式返回NULL。

这种方式类似于java中的if … else if … [else]

注意:两种方式中的表达式都可以嵌套查询,意思是表达式中可以执行SELECT语句

运用场景1:

CREATE TABLE `test`( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '姓名', `sex` char(1) DEFAULT NULL COMMENT '性别 1男 0女', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `test`(`id`,`name`,`sex`) VALUES ('1','张三','1');
INSERT INTO `test`(`id`,`name`,`sex`) VALUES ('2','李四','0');
INSERT INTO `test`(`id`,`name`,`sex`) VALUES ('3','王五','1');
INSERT INTO `test`(`id`,`name`,`sex`) VALUES ('4','赵六','0');

现在要查询所有记录,并且性别要显示’男’或’女’的形式

使用两种语句结果是一样的

SELECT id,`name`,CASE sex WHEN 1 THEN '男' WHEN 0 THEN '女'END AS sex FROM `test`;

SELECT id,`name`,CASE WHEN sex=1 THEN '男' WHEN sex=0 THEN '女' END AS sex FROM `test`;

结果:

+—-+——+—–+
| id | name | sex |
+—-+——+—–+
| 1 | 张三 | 男 |
| 2 | 李四 | 女 |
| 3 | 王五 | 男 |
| 4 | 赵六 | 女 |
+—-+——+—–+
4 rows in set

运用场景2:

CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '姓名', `sex` char(1) DEFAULT NULL COMMENT '性别 1男 0女', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `employee`(`id`,`name`,`sex`,`did`) VALUES('1','张三','1','1');
INSERT INTO `employee`(`id`,`name`,`sex`,`did`) VALUES('2','李四','0','2');
INSERT INTO `employee`(`id`,`name`,`sex`,`did`) VALUES('3','王五','1','3');
INSERT INTO `employee`(`id`,`name`,`sex`,`did`) VALUES('4','赵六','0','4');

CREATE TABLE `depart` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '部门名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `depart`(`id`,`name`) VALUES('1','技术部');
INSERT INTO `depart`(`id`,`name`) VALUES('2','运营部');
INSERT INTO `depart`(`id`,`name`) VALUES('3','销售部');
INSERT INTO `depart`(`id`,`name`) VALUES('4','人事部');

现在要查询所有员工信息,如果是女员工则同时查出部门信息,如果是男员工,就不要管他是什么部门了。

SELECT id,`name`,sex,did, CASE WHEN sex=0 THEN (SELECT `name` FROM depart WHERE id = did) ELSE NULL END AS adpart FROM `employee`

结果如下:

+----+------+-----+-----+--------+
| id | name | sex | did | adpart | +----+------+-----+-----+--------+
|  1 | 张三 | 1   |   1 | NULL   |
|  2 | 李四 | 0   |   2 | 运营部 |
|  3 | 王五 | 1   |   3 | NULL   |
| 4 | 赵六 | 0 | 4 | 人事部 | +----+------+-----+-----+--------+
4 rows in set
    原文作者:SQL
    原文地址: https://blog.csdn.net/zhanjixun/article/details/77954030
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞