MySQL 流程函数

MySQL 流程函数

流程函数是很常用的一类函数,它可以使我们在一个 SQL 中实现条件选择,MySQL 中与条件有关的流程函数,主要有如下几种

  • IF(value, t, f)
    如果 value 为真,返回t,否则返回f
  • IFNULL(value1, value2)
    如果 value1 不为 null 返回 value1,否则返回 value2
  • CASE WHEN [value1] THEN [result1] … ELSE [default] END
    如果 value1 为真,返回 result1,否则返回 default
  • CASE [expr] WHEN [value1] THEN [result1] … ELSE [default] END
    如果 expr 等于 value1,返回 result1,否则返回 default

这四种流程函数,前两个比较熟悉,用的比较多,用法也比较简单,就不多做记录,主要说一下 case 函数。

case 函数

首先需要明确一点,注意上边楼主记录的语法!这是楼主查阅书籍,摘抄下来的,你把它当官方文档看就完事了!

1
CASE WHEN [value1] THEN [result1] ... ELSE [default] END

value1 是一个表达式!当此表达式满足条件,才会返回 value1,所以这种 case 函数 比较强大,我们可以对这个字段上的值进行一些处理和判断,【比如取值是否为 null 也作为一个逻辑分支】

1
CASE [expr] WHEN [value1] THEN [result1] ... ELSE [default] END

看这个 expr 是啥? 注意了它是我们的流程判断条件!当它和 WHEN 后边的 value1 一致的时候,才会返回对应 result1!

从楼主的使用经验来看,第一种可以满足第二种的所有需求,而第二种对于 为null 的值是直接匹配不到的!但是我们可以通过 ELSE 来对前边流程没匹配上的值赋默认值,即间接的对为 null 值进行处理。

  • 案例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

mysql> select *from user limit 5;
+---------+---------------------+-------------+---------------------+------------+------+--------+---------------+
| user_id | create_time | email | update_time | user_name | age | gender | image_content |
+---------+---------------------+-------------+---------------------+------------+------+--------+---------------+
| 6 | 2019-08-16 20:16:10 | 2323@12.com | 2019-08-16 20:41:47 | 韩小姐 | NULL | 0 | NULL |
| 7 | 2019-08-16 21:02:47 | Y | 2020-05-22 22:15:15 | 赵司令0 | 17 | 1 | NULL |
| 8 | 2019-08-16 21:02:47 | N | 2020-05-22 22:15:17 | 赵司令1 | 10 | 0 | NULL |
| 9 | 2019-08-16 21:02:47 | NULL | NULL | 马东升2 | 14 | 1 | NULL |
| 10 | 2019-08-16 21:02:47 | NULL | NULL | 材济济3 | 13 | 0 | NULL |
+---------+---------------------+-------------+---------------------+------------+------+--------+---------------+
5 rows in set (0.00 sec)

mysql> SELECT
-> a.user_id userId,
-> a.create_time createTime,
-> a.email,
-> CASE
-> WHEN a.email IS NULL THEN
-> '无数据'
-> WHEN a.email = 'Y' THEN
-> 'chenfu@qq.com'
-> WHEN a.email = 'N' THEN
-> 'cc@qq.com'
-> ELSE
-> a.email
-> END email,
-> a.user_name userName
-> FROM
-> USER a
-> LIMIT 5;
+--------+---------------------+-------------+---------------+------------+
| userId | createTime | email | email | userName |
+--------+---------------------+-------------+---------------+------------+
| 6 | 2019-08-16 20:16:10 | 2323@12.com | 2323@12.com | 韩小姐 |
| 7 | 2019-08-16 21:02:47 | Y | chenfu@qq.com | 赵司令0 |
| 8 | 2019-08-16 21:02:47 | N | cc@qq.com | 赵司令1 |
| 9 | 2019-08-16 21:02:47 | NULL | 无数据 | 马东升2 |
| 10 | 2019-08-16 21:02:47 | NULL | 无数据 | 材济济3 |
+--------+---------------------+-------------+---------------+------------+
5 rows in set (0.10 sec)

mysql> SELECT
-> a.user_id userId,
-> a.create_time createTime,
-> a.email,
-> CASE
-> a.email
-> WHEN NULL THEN
-> '无数据-NULL'
-> WHEN 'Y' THEN
-> 'chenfu@qq.com'
-> WHEN 'N' THEN
-> 'cc@qq.com'
-> ELSE
-> '无数据'
-> END email,
-> a.user_name userName
-> FROM
-> USER a
-> LIMIT 5;
+--------+---------------------+-------------+---------------+------------+
| userId | createTime | email | email | userName |
+--------+---------------------+-------------+---------------+------------+
| 6 | 2019-08-16 20:16:10 | 2323@12.com | 无数据 | 韩小姐 |
| 7 | 2019-08-16 21:02:47 | Y | chenfu@qq.com | 赵司令0 |
| 8 | 2019-08-16 21:02:47 | N | cc@qq.com | 赵司令1 |
| 9 | 2019-08-16 21:02:47 | NULL | 无数据 | 马东升2 |
| 10 | 2019-08-16 21:02:47 | NULL | 无数据 | 材济济3 |
+--------+---------------------+-------------+---------------+------------+
5 rows in set (0.00 sec)
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 臣服Romantic”
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信