一般情况下,case ...when都用在select语句中,不过可以在其他子句中使用
1 在order by子句中进行自定义排序
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语句实现
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 函数
select * from 20130225t1
order by FIND_IN_SET(b,'甲,乙,丙,丁')
1 甲
3 乙
4 丙
2 丁
2在where子句中用来进行条件查询
考虑以下两张表
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
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查找该角色对应的申请
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
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中
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的表.
分享到:
相关推荐
本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下: 除了if语句,mysql提供了一个替代的条件语句CASE。 mysql的 CASE语句使代码更加可读和高效。废话不多说,我们先来看下简单case语句的...
2)掌握 —— CASE语句的使用方法; case语句 CASE语句语法格式为: 第一种: CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE ...
mysql 中case when 遇到乱码解决。查询语句中含有case引起中文乱码解决方法
主要介绍了MySQL的CASE WHEN语句的几个使用实例,需要的朋友可以参考下
mysql数据库中CASE WHEN语句。 case when语句,用于计算条件列表并返回多个可能结果表达式之一。 CASE 具有两种格式: 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 CASE 搜索函数计算一组布尔...
详细分析 mysql 中的 控制流程语句 if 以及 case when 的使用, 里面 的 sql 语句,已经在 本机上亲自实践,
mysql 中类似php switch case 的语句。 select xx字段, case 字段 when 条件1 then 值1 when 条件2 then 值2 else 其他值 END 别名 from 表名; 下面是一个分组求和示例: select sum...
今天在一个应用中使用到了一个比较特殊的数据查询要求。需要的朋友可以参考下。
case ..when语句 但最近在使用的时候遇到了一个问题,下面话不多说了,来一起看看详细的介绍吧 直接说明问题。我有一张存储身份证号码的表id_card_message,表结构和数据如下(MySQL5.7.14): mysql> select * ...
Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 代码如下: IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的...
如何在mysql查找效率慢的SQL语句呢?...一、MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log 这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。 2,long_query_time 当S
mysql 同时更新多行数据不同的值 一个复杂的多条件更新sql: update users set status = (case user_id when 1 then 0 when 3 then 1 when 4 then 0 else status end) where user_id in (1,3,4) 在多数情况下,执行...
1、”’+ id +”’ 为什么是3个引号,为什么左边一个加号右边一个加号(能不能着重帮我解释下这个,详细点) SQL code sum(case Leave when ”’+ id +”’ then DaysNo else 0 end) [‘+ name +’]’ 正常语句: ...
9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select *...
mysql中写判断语句的方法: 方法一.CASE函数 case函数语法: CASE condition WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3 …… ELSE defaultvalue END 举例: ...
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不...