SQL语句中的case语句与高级语言中的switch语句,是标准SQL的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作。
首先,让我们看一下CASE的语法。在一般的SELECT中,其语法格式如下:
CASE
WHEN THEN
WHEN THEN
...
WHEN THEN
ELSE
END
1
2
3
4
5
6
7
CASE
WHENTHEN
WHENTHEN
...
WHENTHEN
ELSE
END
创建一个用户表
CREATE TABLE `user` (
id int(10) unsigned NOT NULL auto_increment primary key,
sex tinyint(1) COMMENT '性别:0女;1男;2保密'
) ENGINE=InnoDB;
insert into user(sex) select(0);
insert into user(sex) select(1);
insert into user(sex) select(2);
insert into user(sex) select(1);
insert into user(sex) select(0);
1
2
3
4
5
6
7
8
9
10
CREATETABLE`user`(
idint(10)unsignedNOTNULLauto_incrementprimarykey,
sextinyint(1)COMMENT'性别:0女;1男;2保密'
)ENGINE=InnoDB;
insertintouser(sex)select(0);
insertintouser(sex)select(1);
insertintouser(sex)select(2);
insertintouser(sex)select(1);
insertintouser(sex)select(0);
简单Case函数写法
mysql> select sex,(CASE sex WHEN '1' THEN '男' WHEN '0' THEN '女' ELSE '保密' END) as sex_text from user;
+------+----------+
| sex | sex_text |
+------+----------+
| 0 | 女 |
| 1 | 男 |
| 2 | 保密 |
| 1 | 男 |
| 0 | 女 |
+------+----------+
5 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
mysql>selectsex,(CASEsexWHEN'1'THEN'男'WHEN'0'THEN'女'ELSE'保密'END)assex_textfromuser;
+------+----------+
|sex|sex_text|
+------+----------+
|0|女|
|1|男|
|2|保密|
|1|男|
|0|女|
+------+----------+
5rowsinset(0.00sec)
Case搜索函数写法(注意sex的位置【推荐】)
mysql> select sex,(CASE WHEN sex=1 THEN '男' WHEN sex=0 THEN '女' ELSE '保密' END) as sex_text from user;
+------+----------+
| sex | sex_text |
+------+----------+
| 0 | 女 |
| 1 | 男 |
| 2 | 保密 |
| 1 | 男 |
| 0 | 女 |
+------+----------+
5 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
mysql>selectsex,(CASEWHENsex=1THEN'男'WHENsex=0THEN'女'ELSE'保密'END)assex_textfromuser;
+------+----------+
|sex|sex_text|
+------+----------+
|0|女|
|1|男|
|2|保密|
|1|男|
|0|女|
+------+----------+
5rowsinset(0.00sec)
总结:简单Case函数写法只适合相等条件判断,不能用于大于、小于及不等于的判断,Case搜索函数写法适合复杂条件判断:可用于大于、小于及不等于的判断。临时生成的字段是可以排序的,或做其他处理。
IF语句的用法
IF(expr1,expr2,expr3),如果expr1是TRUE,则返回expr2,否则返回expr3。IF不像CASE那样可以多条件判断,IF只能判断“真”、“假”。
mysql> select sex,IF(sex='1','男','未知') as sex_text from user;
+------+----------+
| sex | sex_text |
+------+----------+
| 0 | 未知 |
| 1 | 男 |
| 2 | 未知 |
| 1 | 男 |
| 0 | 未知 |
+------+----------+
5 rows in set (0.01 sec)
1
2
3
4
5
6
7
8
9
10
11
mysql>selectsex,IF(sex='1','男','未知')assex_textfromuser;
+------+----------+
|sex|sex_text|
+------+----------+
|0|未知|
|1|男|
|2|未知|
|1|男|
|0|未知|
+------+----------+
5rowsinset(0.01sec)
除了查询使用CASE/IF外,可能你还会碰到下面这种语句,在UPDATE中使用CASE更新数据。如下操作,注意看更新后的结果,把符合条件的值做对应更新,而把没有符合条件的记录全部重置为默认值,所以如果真有这种需求时一定要多做测试。
mysql> update user set sex=(case when id>2 and id<4 then 0 when id>=4 then 2 end);
Query OK, 5 rows affected (0.01 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> select * from user;
+----+------+
| id | sex |
+----+------+
| 1 | NULL |
| 2 | NULL |
| 3 | 0 |
| 4 | 2 |
| 5 | 2 |
+----+------+
5 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql>updateusersetsex=(casewhenid>2andid<4then0whenid>=4then2end);
QueryOK,5rowsaffected(0.01sec)
Rowsmatched:5Changed:5Warnings:0
mysql>select*fromuser;
+----+------+
|id|sex|
+----+------+
|1|NULL|
|2|NULL|
|3|0|
|4|2|
|5|2|
+----+------+
5rowsinset(0.00sec)
完结。。。
如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。