mysql case...when語句的幾個用法
一般情況下,case ...when都用在select語句中,不過可以在其他子句中使用
1 在order by子句中進行自定義排序
www.2cto.com
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 丙
www.2cto.com
現在想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中
www.2cto.com
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的表.