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> |