服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - SQL 中 CASE 表达式的使用方式

SQL 中 CASE 表达式的使用方式

2022-11-14 16:20Wang1​​​​​​​ Mysql

这篇文章主要介绍了 SQL 中 CASE 表达式的使用方式,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

1. 前言

CASE 表达式是从 SQL-92 标准开始被引入的。

在 CASE 表达式里,可以使用 BETWEEN 、LIKE和 < 、> 等便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。

2. 语法

CASE 表达式有 简单 CASE 表达式(simple case expression) 和 搜索 CASE 表达式(searched case expression) 两种写法:

?
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

sex 列(字段)如果是 '1' ,那么结果为男;如果是 '2' ,那么结果为女。

3. 注意点

CASE在匹配给定条件时,发现为真的 WHEN 子句时,CASE 表达式的真假值判断就会中止,而剩余的 WHEN 子句会被忽略。为了避免引起不必要的混乱,使用 WHEN 子句时要注意条件的排他性。

?
1
2
3
4
-- 例如,这样写的话,结果里不会出现“第二”
CASE WHEN col_1 IN ('a', 'b') THEN '第一'
     WHEN col_1 IN ('a') THEN '第二'
ELSE '其他' END
  • 统一各分支返回的数据类型: 一定要注意 CASE 表达式里各个分支返回的数据类型是否一致。某个分支返回字符型,而其他分支返回数值型的写法是不正确的。
  • 不要忘了写 END: 不写END是语法错误,这是不允许的。
  • 养成写 ELSE 子句的习惯: 与 END 不同,ELSE 子句是可选的,不写也不会出错。不写 ELSE 子句时,CASE 表达式的执行结果是 NULL 。

4. 分类汇总数据

SQL 中 CASE 表达式的使用方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT
    CASE pref_name
        WHEN '德岛' THEN '四国'
        WHEN '香川' THEN '四国'
        WHEN '爱媛' THEN '四国'
        WHEN '高知' THEN '四国'
        WHEN '福冈' THEN '九州'
        WHEN '佐贺' THEN '九州'
        WHEN '长崎' THEN '九州'
    END AS district,
    SUM(population) AS total
FROM poptbl
GROUP BY
    CASE pref_name
        WHEN '德岛' THEN '四国'
        WHEN '香川' THEN '四国'
        WHEN '爱媛' THEN '四国'
        WHEN '高知' THEN '四国'
        WHEN '福冈' THEN '九州'
        WHEN '佐贺' THEN '九州'
        WHEN '长崎' THEN '九州'
    END;

5. 一条SQL实现不同条件的统计

SQL 中 CASE 表达式的使用方式

?
1
2
3
4
5
6
SELECT
    pref_name AS '县名',
    SUM( CASE WHEN sex=1 THEN population ELSE 0 END ) AS '男'
    SUM( CASE WHEN sex=2 THEN population ELSE 0 END ) AS '女'
FROM poptlb
GROUP By pref_name

6. 使用CHECK约束定义多个列的条件关系

假设某公司规定“女性员工的工资必须在 20 万日元以下”,而在这个公司的人事表中,这条无理的规定是使用 CHECK 约束来描述的,代码如下所示:

?
1
2
3
4
5
6
CONSTRAINT check_salary CHECK (
    CASE WHEN sex = '2' THEN
        CASE WHEN salary <= 200000
            THEN 1 ELSE 0 END
        ELSE 1 END = 1
)

7. 在UPDATE语句中进行条件分支

SQL 中 CASE 表达式的使用方式

条件:

  • 对当前工资为 30 万日元以上的员工,降薪 10%。
  • 对当前工资为 25 万日元以上且不满 28 万日元的员工,加薪 20%。
?
1
2
3
4
5
UPDATE Salaries
SET salary = CASE WHEN salary>300000 THEN salary*0.9
                  WHEN salary>=250000 AND salary <280000 THEN salary * 1.2
                  ELSE salary
             END;

8. 生成交叉表

SQL 中 CASE 表达式的使用方式

SQL 中 CASE 表达式的使用方式

SQL 中 CASE 表达式的使用方式

?
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
--- 使用IN谓词
SELECT
    course_name AS '课程名',
    CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200706')
            THEN 'o'
            ELSE 'x'
    END AS '6 月'
    CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200707')
            THEN 'o'
            ELSE 'x'
    END AS '7 月'
    CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200708')
            THEN 'o'
            ELSE 'x'
    END AS '8 月'
FROM course_master;
 
--- 或者使用EXIST谓词
SELECT CM.course_name,
    CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200706 AND OC.course_id = CM.course_id)
        THEN '○' ELSE '×'
    END AS "6 月",
    CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200707 AND OC.course_id = CM.course_id)
        THEN '○' ELSE '×'
    END AS "7 月",
    CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200708 AND OC.course_id = CM.course_id)
        THEN '○' ELSE '×'
    END AS "8 月"
FROM CourseMaster CM;

9. CASE表达式中使用聚合函数

SQL 中 CASE 表达式的使用方式

对于加入了多个社团的学生,通过将其“主社团标志”列设置为 Y 或者 N 来表明哪一个社团是他的主社团;对于只加入了一个社团的学生,将其“主社团标志”列设置为 N。

现需要查询出所有学生加入的社团,若加入了多个则显示主社团

?
1
2
3
4
5
6
7
SELECT
    std_id,
    CASE WHEN COUNT(*)==1 THEN MAX(club_id)
         ELSE MAX(CASE WHEN main_club_flg = 'Y' THEN club_id ELSE NULL END)
    END AS 'main_club'
FROM student_club
GROUP BY std_id

10. 按照自定义规则排序列

SQL 中 CASE 表达式的使用方式

按照mark列排序,要求修正a b c d 的权重为 c b a d

?
1
2
3
4
5
6
7
8
9
10
11
SELECT
    mark
FROM
    sort_test
ORDER BY
    CASE mark
        WHEN 'a' THEN -1
        WHEN 'b' THEN 1
        WHEN 'c' THEN 2
        WHEN 'd' THEN -2
    END

到此这篇关于 SQL 中 CASE 表达式的使用方式的文章就介绍到这了,更多相关 SQL CASE 表达式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7142033761197096990

延伸 · 阅读

精彩推荐
  • MysqlMySQL5.7 JSON类型使用详解

    MySQL5.7 JSON类型使用详解

    MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。 我们先看看MySQL老版本的JSON存取方式,具体内容详情大家参考下本文吧...

    懒得去死5122020-08-14
  • Mysql详解MySQL中事务的持久性实现原理

    详解MySQL中事务的持久性实现原理

    这篇文章主要介绍了详解MySQL中事务的持久性实现原理,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下 ...

    X先生9712021-04-06
  • Mysql你有没有遗忘mysql的历史记录

    你有没有遗忘mysql的历史记录

    程序出现了问题,明知道可能是sql语句造成的,但是因为框架的原因,分析起来十分麻烦,于是打算直接查看数据库里面的历史记录. ...

    MYSQL教程网2602020-04-20
  • MysqlJDBC连接的六步实例代码(与mysql连接)

    JDBC连接的六步实例代码(与mysql连接)

    这篇文章主要给大家介绍了关于JDBC连接的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    香风智乃哈~5202021-07-02
  • Mysql重置MySQL中表中自增列的初始值的实现方法

    重置MySQL中表中自增列的初始值的实现方法

    这篇文章主要介绍了重置MySQL中表中自增列的初始值的实现方法的相关资料,需要的朋友可以参考下...

    bladestone3242020-07-22
  • MysqlMySQL针对Discuz论坛程序的基本优化教程

    MySQL针对Discuz论坛程序的基本优化教程

    这篇文章主要介绍了MySQL针对Discuz论坛程序的基本优化教程,包括在缓存和索引等方面的优化方法,需要的朋友可以参考下 ...

    叶金荣5422020-05-22
  • MysqlMySQL查询语句进阶知识集锦

    MySQL查询语句进阶知识集锦

    上次咱们简单的学习了一下select的用法,对数据库大概有了一些基本的了解。咱们接着上次继续来看叭! ...

    IT共享之家8672021-03-15
  • MysqlMysql5.7如何修改root密码

    Mysql5.7如何修改root密码

    mysql修改管理员root的密码是个很常见的问题了,网上也有很多的教程,然而新版的MYSQL5.7却能使用之前的教程,小编经过一番摸索,才找到了修改办法,这...

    MYSQL教程网4012020-05-31