最新消息:文章中包含代码时,请遵守代码高亮规范!

SQL中case when then用法

MySQL Seven 378浏览 0评论

SQL中case when then用法

case具有两种格式。简单case函数和case搜索函数。

下面给给例子你就知道他的用法了:

view plain copy

  1. create table student(
  2.     name varchar(20) not null–姓名
  3.     subject varchar(20) not null,–科目
  4.     result float not null,–成绩
  5. )
  6. –插入数据
  7. insert into student
  8. select ‘张三’,‘语文’,78 union all
  9. select ‘张三’,‘数学’,68 union all
  10. select ‘张三’,‘英语’,74 union all
  11. select ‘王五’,‘语文’,56 union all
  12. select ‘王五’,‘数学’,89 union all
  13. select ‘王五’,‘英语’,88 union all
  14. select ‘李四’,‘语文’,75 union all
  15. select ‘李四’,‘数学’,64 union all
  16. select ‘李四’,‘英语’,76
  17. –【查询】 
  18. –1.全表查询数据
  19. select * from student
  20. –2.提取横查询 竖表 打横 case when
  21.         姓名     语文  数学  英语
  22.          李四 78     68   74
  23.   —-这样将是 只要不是(语文)的这一行 就设置为 0   注意 这里没有提取最大值 那么依然还是没有改变 表的结构 那么 其他的值已经设为 0了
  24.  select  (case subject when ‘语文’ then result else 0 end)语文,
  25.         (case subject when ‘数学’ then result else 0 end)数学,
  26.         (case subject when ‘英语’ then result else 0 end)英语
  27. from student
  28.  —不进行分组 就会只能 有一条数据
  29. select  MAX(case subject when ‘语文’ then result else 0 end)语文,
  30.                    MAX(case subject when ‘数学’ then result else 0 end)数学,
  31.                    max(case subject when ‘英语’ then result else 0 end)英语
  32. from student
  33.   —以姓名为 分组依据 将【所有】的学生姓名数据都查询出来       
  34.  select name 姓名, MAX(case subject when ‘语文’ then result else 0 end)语文,
  35.                    MAX(case subject when ‘数学’ then result else 0 end)数学,
  36.                    max(case subject when ‘英语’ then result else 0 end)英语
  37. from student group by name
--简单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部分将会被自动忽略。

--比如说,下面这段sql,你永远无法得到“第二类”这个结果
case when col_1 in ('a','b') then '第一类'
     when col_1 in ('a') then '第二类'
     else '其他' end

下面实例演示:
首先创建一张users表,其中包含id,name,sex三个字段,表内容如下:

复制代码
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语句:

复制代码
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 张二                          13 张三                            空的
                                      4 张四                            空的
                                      5 张五                          26 张六                          17 张七                          28 张八                          18 rows selected
复制代码

2、如果不希望列表中出现”sex”列,语句如下:

复制代码
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语句如下:

复制代码
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

转载时请注明出处及相应链接,本文永久地址:https://www.askaura.com/23773.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Steven的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!