视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysqlcase...when语句的几个用法_MySQL
2020-11-09 18:31:33 责编:小采
文档


bitsCN.com


mysql case...when语句的几个用法

一般情况下,case ...when都用在select语句中,不过可以在其他子句中使用

1 在order by子句中进行自定义排序

Sql代码

show create table 20130225t1;

CREATE TABLE `20130225t1` (

`id` tinyint(4) NOT NULL AUTO_INCREMENT,

`b` char(1) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB

select * from 20130225t1;

1 甲

2 丁

3 乙

4 丙

现在想b字段按照甲乙丙丁的顺序排序,直接order by b是不能实现的,正统的做
法可以加一个排序用的字段,按照该字段排序.

不过可以用case when语句实现

Sql代码

select * from 20130225t1

order by case b when '甲' then 1 when '乙' then 2

when '丙' then 3 when '丁' then 4 end

1 甲

3 乙

4 丙

2 丁

还有个手段是find_in_set 函数

Sql代码

select * from 20130225t1

order by FIND_IN_SET(b,'甲,乙,丙,丁')

1 甲

3 乙

4 丙

2 丁

2在where子句中用来进行条件查询

考虑以下两张表

Sql代码

show create table 20130225work

CREATE TABLE `20130225work` (

`id` tinyint(4) NOT NULL AUTO_INCREMENT,

`role_id` tinyint(4) NOT NULL,

`dep_id` tinyint(4) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB

Sql代码

show create table 20130225role

CREATE TABLE `20130225role` (

`id` tinyint(4) NOT NULL,

`role_name` varchar(5) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB

20130225work是各部门提交上来的申请,role_id是能够看到申请的角色的id,dep_id是提交申请的部门

20130225role是角色.

select * from 20130225role

1 部门经理

2 总经理

select * from 20130225work

1 1 1

2 1 2

3 2 1

4 2 2

现在问题是部门经理角色只能看到自己部门的申请,总经理看到所有部门的申请.

(1)可以在20130225work中加个字段need_check,1表示该申请需要检查部门,0表示不需要

现在要根据role id和dep_id查找该角色对应的申请

Sql代码

set @role_id=1;

set @dept_id=1;

select * from 20130225work

where role_id=@role_id and (case need_check

when 1 then dep_id=@dept_id

else 1=1

end)

1 1 1 1

Sql代码

set @role_id=2;

set @dept_id=1;

select * from 20130225work

where role_id=@role_id and (case need_check

when 1 then dep_id=@dept_id

else 1=1

end)

3 2 1 0

4 2 2 0

(2)或者把need_check加到20130225role中

Sql代码

set @role_id=1;

set @dept_id=2;

select * from 20130225work w,20130225role r

where r.id=@role_id and w.role_id=r.id

and (case need_check

when 1 then dep_id=@dept_id

else 1=1

end)

case when也能在group by语句中出现,只是不知道能有啥作用.

其实我最希望它能出现在from语句中,就能动态指定from的表.

bitsCN.com

下载本文
显示全文
专题