```sql
// 第一种写法
CASE
WHEN 列名 = 条件值 THEN 值1
WHEN 列名 = 条件值2 THEN 值2
WHEN 列名 = 条件值3 THEN 值3
ELSE 值4 END
// 第二种写法 可以把列名取出,这种情况用于只有一个列名作为条件的情况
CASE 列名
WHEN 条件值 THEN 值1
WHEN 条件值2 THEN 值2
WHEN 条件值3 THEN 值3
ELSE 值4 END
// 第三种写法,可以无需ELSE 但要求一定会满足WHEN其中一条,否则可能就是NULL了
CASE
WHEN 列名 = 条件值 THEN 值1
WHEN 列名 = 条件值2 THEN 值2
WHEN 列名 = 条件值3 THEN 值3
END
```
select name,
sex,
case when age >= 18 then '成年人'else '未成年'end age
from people
insert into people(name,sex,age,hobby)
values('小刚','男','18',case when '男'='男' then '打篮球' end);
update people set hobby = (case when #{A} = 1 then '跳绳'
when #{A} = 2 then '打篮球'
else hobby
end)
where 其他条件;
delete people where age = (case when #{A} = 'eighteen' then '18'
when #{A} = 'seventeen' then '17'
end);
先准备好数据(我使用oracle数据库,由于本人电脑无安装数据库,使用支持在线写SQL的Oracle学习免费网站)
CREATE TABLE people (
name varchar2(200),
sex varchar2(200),
age varchar2(200),
hobby varchar2(200)
);
INSERT INTO people VALUES ('小明', '男', '18','');
INSERT INTO people VALUES ('小红', '女', '17','');

查询出people表中全部数据,并age大于等于18输出为成年人,小于18输出未成年。
select name,
sex,
case when age >= 18 then '成年人'else '未成年'end age
from people

在使用mybatis的使用,通常都是会将值传入给SQL中,有时候可以根据传入的值设置其他字段的值。
如下:插入两条数据,如果性别是男生的话,全部hobby都写入打篮球。
// 解析一下,在myabtis中如下:
insert into people(name,sex,age,hobby)
values(#{name},#{sex},#{age},case when #{sex}='男' then '打篮球' end);
insert into people(name,sex,age,hobby)
values('小刚','男','18',case when '男'='男' then '打篮球' end);
insert into people(name,sex,age,hobby)
values('小紫','女','18',case when '女'='男' then '打篮球' end);
select * from people

将全部性别为女的爱好都设置为跳绳。
// 这里意思: 设置表people中hobby字段,
// 如果性别是女,则hobby字段设置为跳绳,
// 否则就使用本身表hobby字段的值进行更新,即保持原来表中的值
update people set hobby = (case when sex = '女' then '跳绳' else hobby end);

// 当然上述的sql可以转化为:
update people set hobby = '跳绳' where sex = '女';
// 想必大家肯定是使用第二种的sql书写,原因是这里的条件刚刚好是表里面字段内容
// 如果 java代码中,传入的参数不是sex,而是其他的,比如:
// 传入A,如果A=1则hobby更新为跳绳,A=2则hobby更新为打篮球
update people set hobby = (case when #{A} = 1 then '跳绳'
when #{A} = 2 then '打篮球'
else hobby
end)
where 其他条件;
其实在delete中比较少使用case then,毕竟条件都可以写到where 里面了,当然也是少不了,跟我上述update例子中解释的,可能传入的参数完全跟表对不上情况:
传入参数A,如果是eighteen删除年龄是18岁的人,如果是seventeen删除年龄是17岁的人
delete people where age = (case when #{A} = 'eighteen' then '18'
when #{A} = 'seventeen' then '17'
end);
