[转帖]SQL 里面的 case when 的用法

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     )性别
   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     )性别
   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 )性别为空
   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 )性别为空
   from users u;
  
         男性          女       性别为空
---------- ---------- ----------
          3          2          0

附:我实验的结果

(注意性别为空的地方,应该判断u.sex is null 而不能用 not in或不等于符号去排除)

\

猜你喜欢

转载自www.cnblogs.com/jinanxiaolaohu/p/10843116.html
今日推荐