DQL中常用的流程函数if_case
—流程函数在一个SQL语句中实现条件选择

模拟对职员薪水进行分类:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  | 
						<span style="font-size: 16px;">mysql> create table salary_tab(userid <span style="color: rgba(0, 0, 255, 1);">int</span> not <span style="color: rgba(0, 0, 255, 1);">null</span> primary key,salary dec(<span style="color: rgba(128, 0, 128, 1);">9</span>,<span style="color: rgba(128, 0, 128, 1);">2</span><span style="color: rgba(0, 0, 0, 1);">)); Query OK, </span><span style="color: rgba(128, 0, 128, 1);">0</span> rows affected (<span style="color: rgba(128, 0, 128, 1);">0.04</span><span style="color: rgba(0, 0, 0, 1);"> sec) mysql</span>> insert into salary_tab values(<span style="color: rgba(128, 0, 128, 1);">1</span>,<span style="color: rgba(128, 0, 128, 1);">1000</span><span style="color: rgba(0, 0, 0, 1);">); mysql</span>> insert into salary_tab values(<span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 128, 1);">2000</span><span style="color: rgba(0, 0, 0, 1);">); mysql</span>> insert into salary_tab values(<span style="color: rgba(128, 0, 128, 1);">3</span>,<span style="color: rgba(128, 0, 128, 1);">3000</span><span style="color: rgba(0, 0, 0, 1);">); mysql</span>> insert into salary_tab(userid) values(<span style="color: rgba(128, 0, 128, 1);">4</span><span style="color: rgba(0, 0, 0, 1);">); mysql</span>> insert into salary_tab values(<span style="color: rgba(128, 0, 128, 1);">5</span>,<span style="color: rgba(128, 0, 128, 1);">1000</span><span style="color: rgba(0, 0, 0, 1);">); mysql</span>> <span style="color: rgba(0, 0, 255, 1);">select</span> * <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> salary_tab; </span>+--------+---------+ | userid | salary  | +--------+---------+ |      <span style="color: rgba(128, 0, 128, 1);">1</span> | <span style="color: rgba(128, 0, 128, 1);">1000.00</span> | |      <span style="color: rgba(128, 0, 128, 1);">2</span> | <span style="color: rgba(128, 0, 128, 1);">2000.00</span> | |      <span style="color: rgba(128, 0, 128, 1);">3</span> | <span style="color: rgba(128, 0, 128, 1);">3000.00</span> | |      <span style="color: rgba(128, 0, 128, 1);">4</span> |    NULL | |      <span style="color: rgba(128, 0, 128, 1);">5</span> | <span style="color: rgba(128, 0, 128, 1);">1000.00</span> | +--------+---------+ <span style="color: rgba(128, 0, 128, 1);">5</span> rows <span style="color: rgba(0, 0, 255, 1);">in</span> <span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 128, 1);">0.00</span> sec)</span>  | 
					
1、IF(expr1,expr2,expr3)
判断第一个参数expr1为TRUE (expr1 <> 0 and expr1 <> NULL):
成功,返回第二个参数expr2
失败,返回第三个参数expr3
返回值可以是数字、字符串、列值
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24  | 
						<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(0, 0, 255, 1);">if</span>(<span style="color: rgba(0, 0, 255, 1);">null</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">非空</span><span style="color: rgba(128, 0, 0, 1);">'</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">空</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">); </span>+-------------------------+ | <span style="color: rgba(0, 0, 255, 1);">if</span>(<span style="color: rgba(0, 0, 255, 1);">null</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">非空</span><span style="color: rgba(128, 0, 0, 1);">'</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">空</span><span style="color: rgba(128, 0, 0, 1);">'</span>)    | +-------------------------+ | 空                      | +-------------------------+<span style="color: rgba(0, 0, 0, 1);"> mysql</span>> <span style="color: rgba(0, 0, 255, 1);">select</span> userid,<span style="color: rgba(0, 0, 255, 1);">if</span>(salary><span style="color: rgba(128, 0, 128, 1);">2000</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">high</span><span style="color: rgba(128, 0, 0, 1);">'</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">low</span><span style="color: rgba(128, 0, 0, 1);">'</span>) <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> salary_tab; </span>+--------+------------------------------+ | userid | <span style="color: rgba(0, 0, 255, 1);">if</span>(salary><span style="color: rgba(128, 0, 128, 1);">2000</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">high</span><span style="color: rgba(128, 0, 0, 1);">'</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">low</span><span style="color: rgba(128, 0, 0, 1);">'</span>) | +--------+------------------------------+ |      <span style="color: rgba(128, 0, 128, 1);">1</span> | low                          | |      <span style="color: rgba(128, 0, 128, 1);">2</span> | low                          | |      <span style="color: rgba(128, 0, 128, 1);">3</span> | high                         | |      <span style="color: rgba(128, 0, 128, 1);">4</span> | low                          | |      <span style="color: rgba(128, 0, 128, 1);">5</span> | low                          | +--------+------------------------------+<span style="color: rgba(0, 0, 0, 1);"> mysql</span>> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(0, 0, 255, 1);">if</span>(<span style="color: rgba(128, 0, 128, 1);">1</span>><span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 128, 1);">3</span>),<span style="color: rgba(0, 0, 255, 1);">if</span>(<span style="color: rgba(128, 0, 128, 1);">1</span><<span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">yes</span><span style="color: rgba(128, 0, 0, 1);">'</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">no</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">); </span>+-------------+--------------------+ | <span style="color: rgba(0, 0, 255, 1);">if</span>(<span style="color: rgba(128, 0, 128, 1);">1</span>><span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 128, 1);">3</span>) | <span style="color: rgba(0, 0, 255, 1);">if</span>(<span style="color: rgba(128, 0, 128, 1);">1</span><<span style="color: rgba(128, 0, 128, 1);">2</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">yes</span><span style="color: rgba(128, 0, 0, 1);">'</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">no</span><span style="color: rgba(128, 0, 0, 1);">'</span>) | +-------------+--------------------+ |           <span style="color: rgba(128, 0, 128, 1);">3</span> | yes                | +-------------+--------------------+</span>  | 
					
2、IFNULL(expr1,expr2)
判断第一个参数expr1是否为NULL:
如果expr1不为空,直接返回expr1;
如果expr1为空,返回第二个参数 expr2
常用在算术表达式计算和组函数中,用来对null值进行转换处理(返回值是数字或者字符串)
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | 
						<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span> ifnull(salary,<span style="color: rgba(128, 0, 128, 1);">0</span>) <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> salary_tab; </span>+------------------+ | ifnull(salary,<span style="color: rgba(128, 0, 128, 1);">0</span>) | +------------------+ |          <span style="color: rgba(128, 0, 128, 1);">1000.00</span> | |          <span style="color: rgba(128, 0, 128, 1);">2000.00</span> | |          <span style="color: rgba(128, 0, 128, 1);">3000.00</span> | |             <span style="color: rgba(128, 0, 128, 1);">0.00</span> | |          <span style="color: rgba(128, 0, 128, 1);">1000.00</span> | +------------------+<span style="color: rgba(0, 0, 0, 1);"> mysql</span>> <span style="color: rgba(0, 0, 255, 1);">select</span> ifnull(<span style="color: rgba(128, 0, 128, 1);">1</span>/<span style="color: rgba(128, 0, 128, 1);">0</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">yes</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">); </span>+-------------------+ | ifnull(<span style="color: rgba(128, 0, 128, 1);">1</span>/<span style="color: rgba(128, 0, 128, 1);">0</span>,<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">yes</span><span style="color: rgba(128, 0, 0, 1);">'</span>) | +-------------------+ | yes               | +-------------------+</span>  | 
					
NULLIF(expr1,expr2):如果两个参数相等则返回NULL,否则返回第一个参数的值expr1
| 
					 1 2 3 4 5 6  | 
						<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span> nullif(<span style="color: rgba(128, 0, 128, 1);">1</span>,<span style="color: rgba(128, 0, 128, 1);">1</span>),nullif(<span style="color: rgba(128, 0, 128, 1);">123</span>,<span style="color: rgba(128, 0, 128, 1);">321</span><span style="color: rgba(0, 0, 0, 1);">); </span>+-------------+-----------------+ | nullif(<span style="color: rgba(128, 0, 128, 1);">1</span>,<span style="color: rgba(128, 0, 128, 1);">1</span>) | nullif(<span style="color: rgba(128, 0, 128, 1);">123</span>,<span style="color: rgba(128, 0, 128, 1);">321</span>) | +-------------+-----------------+ |        NULL |             <span style="color: rgba(128, 0, 128, 1);">123</span> | +-------------+-----------------+</span>  | 
					
3、在SQL语句中实现“if-then-else”逻辑计算功能
有两种形式:simple case和searched case
1)simple case的语法结构:
| 
					 1 2 3 4 5 6 7  | 
						<span style="color: rgba(0, 0, 0, 1); font-size: 16px;">CASE  value     WHEN  [compare_value] THEN  result     [WHEN [compare_value] THEN  result ...]      [ELSE  result]  END</span>  | 
					
语义:
将case后面的值value分别和每个when子句后面的值compare_value进行相等比较:
如果一旦和某个when子句后面的值相等则返回相应的then子句后面的值result;
如果和所有when子句后面的值都不相等,则返回else子句后面的值;
如果没有else部分则返回null。
注意:
①value可以是字面量、表达式或者列名
②CASE表达式的数据类型取决于跟在then或else后面的表达式的类型
类型必须相同(可尝试做隐式类型转换),否则出错
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span> userid,<span style="color: rgba(0, 0, 255, 1);">case</span><span style="color: rgba(0, 0, 0, 1);"> salary                                                  </span>-> when <span style="color: rgba(128, 0, 128, 1);">1000</span> then <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">low</span><span style="color: rgba(128, 0, 0, 1);">'</span>     -> when <span style="color: rgba(128, 0, 128, 1);">2000</span> then <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">med</span><span style="color: rgba(128, 0, 0, 1);">'</span>     -> when <span style="color: rgba(128, 0, 128, 1);">3000</span> then <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">high</span><span style="color: rgba(128, 0, 0, 1);">'</span>     -> <span style="color: rgba(0, 0, 255, 1);">else</span> <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">无效值</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);"> end <span style="color: rgba(255, 0, 0, 1);">salary_grade     </span></span>-> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> salary_tab; </span>+--------+--------------+ | userid | salary_grade | +--------+--------------+ |      <span style="color: rgba(128, 0, 128, 1);">1</span> | low          | |      <span style="color: rgba(128, 0, 128, 1);">2</span> | med          | |      <span style="color: rgba(128, 0, 128, 1);">3</span> | high         | |      <span style="color: rgba(128, 0, 128, 1);">4</span> | 无效值        | |      <span style="color: rgba(128, 0, 128, 1);">5</span> | low          | +--------+--------------+</span>  | 
					
2)searched case的语法结构:
| 
					 1 2 3 4 5 6 7  | 
						<span style="color: rgba(0, 0, 0, 1); font-size: 16px;">CASE     WHEN [condition] THEN result     [WHEN [condition] THEN result ...]     [ELSE result]  END</span>  | 
					
语义:
如果某个when子句后面的条件condition为true,则返回相应的when子句后面的值result;
如果所有的when子句后面的条件condition都不为true,则返回else子句后面的值;
如果没有else部分则返回null。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span> userid,<span style="color: rgba(0, 0, 255, 1);">case</span>     -> when salary<=<span style="color: rgba(128, 0, 128, 1);">1000</span> then <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">low</span><span style="color: rgba(128, 0, 0, 1);">'</span>     -> when salary=<span style="color: rgba(128, 0, 128, 1);">2000</span> then <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">med</span><span style="color: rgba(128, 0, 0, 1);">'</span>     -> when salary>=<span style="color: rgba(128, 0, 128, 1);">3000</span> then <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">high</span><span style="color: rgba(128, 0, 0, 1);">'</span>     -> <span style="color: rgba(0, 0, 255, 1);">else</span> <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">无效值</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);"> end salary_grade     </span>-> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> salary_tab; </span>+--------+--------------+ | userid | salary_grade | +--------+--------------+ |      <span style="color: rgba(128, 0, 128, 1);">1</span> | low          | |      <span style="color: rgba(128, 0, 128, 1);">2</span> | med          | |      <span style="color: rgba(128, 0, 128, 1);">3</span> | high         | |      <span style="color: rgba(128, 0, 128, 1);">4</span> | 无效值        | |      <span style="color: rgba(128, 0, 128, 1);">5</span> | low          | +--------+--------------+</span>  |