我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

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中各类数据的大小统计

二维码
扫一扫在手机端查看

本文链接:https://by928.com/6374.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线