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

发布: 2016-08-05
热度: 48
趋势: 48
权重: 0
🎯

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

语法语义

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
当前文章暂无讨论,留下脚印吧!
大纲
  • 语法语义
  • 两种写法
  • 应用
    • 其他用法
    • 衍生思路
提交成功,请等待审核通过后全面展示!

发表评论

昵称
邮箱
链接
签名
评论

温馨提示:系统将通过浏览器临时记忆您曾经填写的个人信息且支持修改,评论提交后仅自己可见,内容需要经过审核后方可全面展示。

选择头像