[转帖]SQL 里面的 case when 的用法
- SQL之case when then else end用法介绍
-
https://www.2cto.com/database/201804/740772.html 要培训了 看到有case when 之前只是听说过 sql语句用的太少了 简单学习一下.
case具有两种格式。简单case函数和case搜索函数。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。 ?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或不等于符号去排除)

更多精彩