MySQL中case when语句的使用是学习MySQL数据库时必须学习的。
下面列出了 MySQL 中使用 case when 语句的三种方法
用法 1
select name, case when birthday < '1981' then 'old' when birthday > '1988' then 'yong' else 'ok' END YORN from lee;
用法 2
select NAME, case name when 'sam' then 'yong' when 'lee' then 'handsome' else 'good' end from lee;
当然,case when语句也可以是复合的
用法 3
select name, birthday, case when birthday>'1983' then 'yong' when name='lee' then 'handsome' else 'just so so ' end from lee;
mimvp 示例
mysql> select type, round(sum(count)), case when round(sum(count)) > 10000000 then 'tuhao' when round(sum(count)) > 1000000 then 'fuhao' else 'pingmin' end as type from cibn_20161220 group by type; +-----------+-------------------+---------+ | type | round(sum(count)) | type | +-----------+-------------------+---------+ | mimvp.com | 10387678064 | tuhao | | mimvp.net | 12050332 | tuhao | | mimvp.win | 6814655 | fuhao | | mimvp.top | 983403 | pingmin | | mimvp.cn | 64172 | pingmin | +-----------+-------------------+---------+
案例有两种格式
案例简单功能和案例搜索功能
1. Case简单函数
案例性别
当 '1' 时则为 '男性'
如果是‘2’则为‘女性’
否则“其他”结束
2. 案例搜索功能
当性别 = '1' 时,则为 '男性'
当性别 = '2' 时则为 '女'
否则“其他”结束
这两种方式都能实现同样的功能,简单Case函数的写法相对简洁,但是和Case搜索函数相比,有一些功能上的限制,比如要写age>=18和age=5000时的判断;
--条件 2
设置 = * 1.15
其中 >= 2000 且 < 4600;
但事情并没有想象的那么简单。假设有一个工资为 5000 元的人,首先按照条件 1,工资减少 10% 为 4500 元。那么在运行第二条 SQL 时,因为这个人的工资是 4500 元,在 2000 到 4600 元的范围内,所以需要增加 15%。最后这个人的工资是 5175 元,不但没有减少反而增加了。如果反向执行,工资为 4600 元的人的工资就会减少。
不管这个规则有多么荒唐,如果我们想用SQL语句实现这个功能,就需要用到Case函数,代码如下:
设置 = CASE 当 >= 5000 时
然后 * 0.9
当 >= 2000 且 < 4600 时
然后 * 1.15
否则结束;
这里要注意的一点是,最后一行的ELSE是必须的,如果没有这一行,不满足这两个条件的人的工资就会写成NUll,这是一个很大的问题。Case函数中Else部分的默认值是NULL,这个是需要注意的。
这个方法还可以用在很多地方,比如改变主键。
一般来说,如果要交换a、b两个数据的key,需要经过暂存、复制、读回数据三个过程,如果使用Case函数,一切都会变得简单很多。
密钥
col_1
col_2
张三
李斯
王武
假设有上述数据,我们需要将主键a和b进行交换,如果使用Case函数来实现,代码如下:
设置 p_key = CASE 当 p_key = 'a' 时则为 'b'
当 p_key = 'b' 时则为 'a'
否则 p_key 结束
其中 p_key 在 ('a','b');
同样的,两个键是可以交换的,需要注意的是,如果需要交换主键,很可能是表的设计做得不够好,建议检查表的设计是否合适。
5.检查两个表的数据是否一致
Case 函数与函数不同。在 Case 函数中,可以使用 LIKE、IS NULL、IN 等。
例如,使用IN,可以执行子查询来实现更多功能。
我们举个例子来说明一下,有两张表,tbl_A和tbl_B,这两张表都有列,现在我们来对比一下这两张表,如果在tbl_B的列的数据中能找到tbl_A的列的数据,则返回结果为'',如果找不到,则返回结果为''
要实现下面的功能,可以使用下面两个语句
--使用 IN 时
,
案例当在(来自 tbl_B)
然后 ''
ELSE''END标签
来自 tbl_A;
--使用时
,
案例当(*来自 tbl_B
其中 tbl_A。= tbl_B。)
然后 ''
ELSE''END标签
来自 tbl_A;
使用 IN 和 结果相同。 也可以使用 NOT IN 和 NOT,但必须注意 NULL 的情况。
6. 在 Case 函数中使用聚合函数
假设有下表
学生证 ()
课程编号()
课程名称()
主要标志 ()
100
经济学
100
历史
200
历史
200
考古学
200
电脑
300
电脑
400
化学
500
数学
有些学生会同时选择多门课程(100、200),而有些学生只选择一门课程(300、400、500)。选择多门课程的学生需要选择一门课程作为专业,并在专业标志中写上 Y。只选择一门课程的学生的专业标志为 N(其实如果写 Y,下面就不会有麻烦了。为了举例,请大家多包涵)。
现在我们需要根据以下两个条件查询该表
对于只选修一门课程的学生,返回该课程的 ID
对于选修了多门课程的用户,返回所选主课程的ID
简单的想法就是执行两个不同的SQL语句进行查询。
条件 1
--条件1:只选修一门课程的学生
,MAX()作为
从
分组依据
计数(*)= 1;
执行结果1
------ ----------
300 4
400 5
500 6
条件 2
--条件2:选择多门课程的学生
, 作为
从
其中 = 'Y' ;
执行结果2
------ ----------
100 1
200 三
如果使用Case函数,我们只需一条SQL语句就可以解决问题,如下所示:
,
CASE WHEN COUNT(*) = 1 —— 学生只选择一门课程的情况
然后 MAX()
否则 MAX(CASE WHEN = 'Y'
然后
否则为空结束
结束于
从
分组依据;
操作结果
------ ----------
100 1
200 三
300 4
400 5
500 6
我们可以通过在 Case 函数中嵌套 Case 函数、在聚合函数中使用 Case 函数等方式轻松解决这个问题。使用 Case 函数可以给我们更大的自由。
最后,还是提醒一下新使用Case函数的用户,避免犯以下几个错误:
案例 col_1
当 1 时则 '正确'
若为 NULL,则为“错误”
结尾
在这个语句中,When Null 行总是返回的,所以永远不会出现 Wrong 的情况。因为这句话可以替换成 WHEN col_1 = NULL,这是不正确的用法。这时候我们应该选择 WHEN col_1 IS NULL。
推荐参考:
MySQL 函数
MySQL 和 group by 性能比较
MySQL 查询语句获取整数或小数
MySQL命令操作(Linux平台)
删除数据后MySQL物理空间没有释放
MySQL 查看数据库大小、表大小以及最后修改时间
使用uft-8解决中文编码乱码问题
MySQL常用语法汇总
MySQL时间函数加减计算
MySQL 创建、修改和删除索引的命令
MySQL 存储引擎及其区别
MySQL SQL执行和慢查询监控
Redis中各类数据的大小统计
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。