- SQL之case when then else end用法介绍
-
https://www.2cto.com/database/201804/740772.html 要培训了 看到有case when 之前只是听说过 sql语句用的太少了 简单学习一下.
case具有两种格式。简单case函数和case搜索函数。
1
2
3
4
5
6
7
8
9
|
--简单case函数 case sex
when '1' then '男'
when '2' then '女’
else ' 其他 ' end
--case搜索函数 case when sex = ' 1 ' then ' 男 '
when sex = ' 2 ' then ' 女 '
else ' 其他' end
|
这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。
还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
1
2
3
4
|
--比如说,下面这段sql,你永远无法得到“第二类”这个结果 case when col_1 in ( 'a' , 'b' ) then '第一类'
when col_1 in ( 'a' ) then '第二类'
else '其他' end
|
下面实例演示:
首先创建一张users表,其中包含id,name,sex三个字段,表内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
SQL> drop table users purge;
drop table users purge
ORA-00942: 表或视图不存在 SQL> create table users(id int , name varchar2(20),sex number);
Table created
SQL> insert into users(id, name ) values (1, '张一' );
1 row inserted SQL> insert into users(id, name ,sex) values (2, '张二' ,1);
1 row inserted SQL> insert into users(id, name ) values (3, '张三' );
1 row inserted SQL> insert into users(id, name ) values (4, '张四' );
1 row inserted SQL> insert into users(id, name ,sex) values (5, '张五' ,2);
1 row inserted SQL> insert into users(id, name ,sex) values (6, '张六' ,1);
1 row inserted SQL> insert into users(id, name ,sex) values (7, '张七' ,2);
1 row inserted SQL> insert into users(id, name ,sex) values (8, '张八' ,1);
1 row inserted SQL> commit ;
Commit complete
SQL> select * from users;
ID NAME SEX
--------------------------------------- -------------------- ---------- 1 张一
2 张二 1
3 张三
4 张四
5 张五 2
6 张六 1
7 张七 2
8 张八 1
8 rows selected
|
1、上表结果中的"sex"是用代码表示的,希望将代码用中文表示。可在语句中使用case语句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
SQL> select u.id,u. name ,u.sex,
2 ( case u.sex
3 when 1 then '男'
4 when 2 then '女'
5 else '空的'
6 end
7 )性别
8 from users u;
ID NAME SEX 性别
--------------------------------------- -------------------- ---------- ------ 1 张一 空的
2 张二 1 男
3 张三 空的
4 张四 空的
5 张五 2 女
6 张六 1 男
7 张七 2 女
8 张八 1 男
8 rows selected
|
2、如果不希望列表中出现"sex"列,语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
SQL> select u.id,u. name ,
2 ( case u.sex
3 when 1 then '男'
4 when 2 then '女'
5 else '空的'
6 end
7 )性别
8 from users u;
ID NAME 性别
--------------------------------------- -------------------- ------ 1 张一 空的
2 张二 男
3 张三 空的
4 张四 空的
5 张五 女
6 张六 男
7 张七 女
8 张八 男
8 rows selected
|
3、将sum与case结合使用,可以实现分段统计。
如果现在希望将上表中各种性别的人数进行统计,sql语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
SQL> select
2 sum ( case u.sex when 1 then 1 else 0 end )男性,
3 sum ( case u.sex when 2 then 1 else 0 end )女性,
4 sum ( case when u.sex <>1 and u.sex<>2 then 1 else 0 end )性别为空
5 from users u;
男性 女性 性别为空
---------- ---------- ---------- 3 2 0
-------------------------------------------------------------------------------- SQL> select
2 count ( case when u.sex=1 then 1 end )男性,
3 count ( case when u.sex=2 then 1 end )女,
4 count ( case when u.sex <>1 and u.sex<>2 then 1 end )性别为空
5 from users u;
男性 女 性别为空
---------- ---------- ---------- 3 2 0
|
附:我实验的结果
(注意性别为空的地方,应该判断u.sex is null 而不能用 not in或不等于符号去排除)