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或不等于符号去排除)

[转帖]SQL 里面的 case when 的用法的更多相关文章

  1. SQL:select case when 的用法

    CASE 可能是 SQL 中被误用最多的关键字之一.虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法.例如,你可以在 WHERE 子句中使用 CASE. 首先让我们看一下 CASE 的语法 ...

  2. [转帖]PG里面的Citus简介----找时间学习一下.

    1. Citus是什么 是PostgreSQL的扩展,可以同PG一同安装,之后通过SQL命令加入到数据库中. [相关操作] ? 1 2 #创建Citus扩展: CREATE EXTENSION cit ...

  3. SQL 里面的COALESCE函数

    在SQL里面除了is null 还有这样一个还用的方法 COALESCE(值[, ...]) select COALESCE(NULL,NULL,'AAAA') -> 'AAAA' 意思是前面的 ...

  4. 【转】sql里面的split

    CREATE function [dbo].[SplitString]( @Input nvarchar(max), @Separator nvarchar(max)=',', @RemoveEmpt ...

  5. Oracle的sql语句中case关键字的用法 & 单双引号的使用

    关于sql中单引号和双引号的使用,来一点说明: 1. 查询列的别名如果含有汉字或者特殊字符(如以'_'开头),需要用双引号引起来.而且只能用双引号,单引号是不可以的. 2. 如果想让某列返回固定的值, ...

  6. 转-sql中的case when的用法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  7. sql server中case when的用法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  8. sql 里的 IF ELSE 语句用法

      IF ELSE 语句 IF ELSE 是最基本的编程语句结构之一几乎每一种编程语言都支持这种结构而 它在用于对从数据库返回的数据进行检查是非常有用的TRANSACT-SQL 使用IF ELSE 的 ...

  9. 尝试一下sql server2016里面的json功能

    前2天下载了一个2016的rc版本来玩一下,首先感觉是~开发者版本免费啦!!撒花!!!另外一个东西,sql server 2016能支持json 的解析和应用啦,虽然我不知道它的性能如何,先来一发测试 ...

随机推荐

  1. Python 分页和shell命令行模式

    前言 除了手动添加你的文章后外,你还可以用命令行来添加,python 自带了一种命令行 就是 shell 快速添加博文:Shell命令行模式 在你的目录下:mysite python manage.p ...

  2. 查看是否安装jdk及路径

    JDK能否曾经装置,可以在cmd窗口里输出java -version,假定没有提示出错,就表示曾经装置. JDK的装置途径,可以输出java -verbose,会前往很多信息,其中就包括了JDK的装置 ...

  3. 【leetcode】Valid Parenthesis String

    题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to ...

  4. Quantitative Strategies for Achieving Alpha (三)

    chapter 4: Profitability Profitability measures we tested include return on invested capital, return ...

  5. Send Email

    private string SendEmail(string mailTo, string body, ref int sendresult) { string errorEmailAddress ...

  6. 由于数据库 'XXX' 离线,无法打开该数据库。

    大家使用sql server 进行还原的时候可能会遇到: system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权 这个错误 下面是有一个解决 ...

  7. window.location.href 兼容性问题 (ie 浏览器下设置失效)

    window.location.href 兼容性问题 (ie 下设置失效) window.location.href = "../index.html" (ie 浏览器失效) wi ...

  8. Java数据结构之二叉树的基本介绍与递归遍历

    二叉树的基本概念: 正如我们所了解的,树是有很多中形态,但是我们规定,形如每个节点最多只能有两个子节点的一种形如称为二叉树.我们将二叉树中该节点的两个子节点分别称作为:左孩子节点和右孩子节点.该节点称 ...

  9. maven 私服的setting.xml配置

    <?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://m ...

  10. 程序员心髓:移动应用API设计10大技巧

    移动App与基于Web/云服务发生对话是很常见的事情,最简单的可能仅仅只是检索数据,但也可能包含发送数据.用户授权和管理.而这也就验证了为移动应用建立API的重要性,为此,我们特总结了10大移动API ...