SQL通过CASE WHEN语句实现条件返回

通过CASE WHEN语句进行设置不同的条件格式匹配后返回指定的值,能够在不修改源表数据的前提下查询展示出我们需要的信息,CASE WHEN语句的语法语义以及实际使用案例。

所属分类 数据库

相关标签 SQL条件语法

语法语义

CASE WHEN {condition} THEN {result}
 
[WHEN...THEN...]
 
ELSE {result}

END

WHEN{condition}是一个返回布尔类型的表达式

  1. 如果表达式返回true,则整个函数返回相应THEN后的{result}值
  2. 如果表达式返回false,则继续匹配后续的WHEN条件
  3. 如果所有表达式均返回false,则返回ELSE后的{result}值
  4. 如果没有配置ELSE {result},则返回null

需要特别注意的是,当WHEN被匹配后会直接执行当WHEN对应的THEN,后续的WHEN就会被舍弃。

两种写法

CASE WHEN的SQL有两种写法,下方直接以实例进行说明:

--写法1
--WHEN后面的表达式支持AND进行多条件匹配 
CASE
    WHEN age > 60 THEN '老人'
    WHEN age > 35 AND age <= 60 THEN '中年人'
    WHEN age > 20 AND age <= 35 THEN '青年人'
    WHEN age > 15 AND age <= 20 THEN '少年人' 
    ELSE '儿童' END
--写法2
--这是简单简单CASE格式
--仅支持字段与数据对比(即常说的等于)
--字段值与数据的数据类型必须相同或者可被隐性转换
--比如:数字类型的age可以和数字比(如本案例)
--数字类型的age可以和数字字符串字符串比(WHEN '60' THEN '60生日老人')
--而(WHEN 'abc' THEN '怪人')则会报错
CASE age 
    WHEN 60 THEN '60生日老人'
    WHEN 40 THEN '40中年人'
    WHEN 20 THEN '20青年人'
    WHEN 15 THEN '15少年人' 
    ELSE '儿童' END

此外需要注意的是,THEN {result} 和 ELSE {result}中的{result}类型必须一致。

比如下方的语法则会出错!

--这里THEN后面既有输出字符串也有输出数字的,无法统一类型
CASE age 
    WHEN 60 THEN '60生日老人'
    WHEN 40 THEN 10086
    WHEN 20 THEN '20青年人'
    WHEN 15 THEN 12345 
    ELSE 10010 END

应用

CASE WHEN一般放在SELECT子句内,下方通过案例进行了解其应用。

--如果sex为1查询出男、为2查询出女、其他查询出外星人
--并将结果命名为sex_name
SELECT u.name,
    CASE u.sex 
        WHEN 1 THEN '男'
        WHEN 2 THEN '女'
        ELSE '外星人' END AS sex_name
FROM sys_user u
--CASE WHEN判空 名字为空显示指定字符串
CASE WHEN name IS NULL THEN '未知姓名' ELSE name END
--关于判空MySQL中有IFNULL(字段, 为空返回值)函数

CASE WHEN可以通过某个特定的type字段分别从不同的表中查询数据(虽然这个方式非常不效率)

--如果文章type为1从post_book表取图片
--如果文章type为2从post_tool表取图片
--否则返回默认图片
SELECT p.id, p.img,
    CASE p.type
        WHEN 1 THEN 
            (SELECT b.img FROM post_book b WHERE b.pid = p.id)
        WHEN 2 THEN 
            (SELECT t.img FROM post_tool t WHERE t.pid = p.id)
        ELSE '/normalImg.png'
        END AS logo
FROM post p

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

数据库

Oracle存储过程Procedure基础语法

存储过程是个好东西,WEB工程在架构阶段会设计很多存储过程,后续在架构中开发需求的时候,反而会直接写SQL完成各项诉求。所以说,这玩意儿略微有那么一点点伪高端。

SPOOL导出指定格式的Oracle数据文件

为了方便数据的处理,或者本身有特殊的数据格式要求,我们可以使用SPOOL命令导出Oracle数据库数据数据文件,并指定格式,高效且强大...

Orcale定时任务管理dbms_job

在Oracle中创建、运行、维护定时任务,配合存储过程可以完成很多特定的业务诉求,dbms_job提供了使用的API功能便于我们实现更为细致的定时任务管理

Oracle数据库基础实用维护命令集

Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句

MongoDB通过$lookup实现多表连接查询

对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询

MySql数据库设置表名大小写不敏感

MySql数据库在Linux系统下默认数据库名与表名严格区分大小写,一般情况下我们创建表名习惯使用全小写,如果遇到某些从Windows服务器迁移过来的数据库可能需要设置大小写不敏感

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核