❗️你有0条未读消息

mysql中CASE...WHEN的使用

13/53,每周一篇博,坚持!

背景

Mysql一直是我的弱项之一,以前跟数据库打交道比较少,基本只限于基本的操作。现在专职做后端之后,跟数据库打交道的机会多了很多,Mysql这块也在有意识的补强。这篇博客就记录一下最近项目中使用到的CASE…WHEN的使用。

很多情况下,我们会用到映射结构,如将某个类型描述映射为某个数字,常见的如页面下拉框中通常我们会把文本赋值具体显示的值,把value赋值映射过的数字,如下代码所示:

1
2
3
4
5
6
<select name="status">
<option value="0">全部</option>
<option value="1">试运营</option>
<option value="2">运营中</option>
<option value="3">已退出</option>
</select>

我们在代码中拿到了相应的数字通常是使用Switch…Case结构来获取映射的状态值。而Mysql中的CASE…WHEN结构就是做类似的事情。

使用方式

假设下面的场景:
我们要从某个表中同步数据,源表的status字段存储的为tinyint的数字用来表示状态,映射关系如上述select中所述。我们希望同步过来后直接以文本形式存储在目的表中。
采用MySQL的CASE…WHEN可以这么写:

1
2
3
4
5
6
7
INSERT TABLE dest_table
SELECT CASE status
WHEN 1 THEN "试运营"
WHEN 2 THEN "运营"
WHEN 3 THEN "已退出"
END
FROM origin_table;

类似这样的需求,将后端程序中的映射提前到了数据库处理,减少了后端开发的成本。

我们再看一个稍微复杂一点的需求:
我们需要将具体的数值对外脱敏,脱敏层级为0-50,50-100,100-200,200+。意味着对应区间内的数值渲染时都将映射为区间显示。
如果要在后端程序里做,我们需要额外编写数据映射处理方法,就不如直接在Mysql中处理来的简单方便:

1
2
3
4
5
6
SELECT CASE
WHEN (ord_cnt > 0 AND ord_cnt <= 50) THEN "0-50单"
WHEN (ord_cnt > 50 AND ord_cnt <= 100) THEN "50-100单"
WHEN (ord_cnt > 100 AND ord_cnt <= 200) THEN "100,200单"
WHEN (ord_cnt > 200) THEN "200单以上"
FROM origin_table;

赞 赏

如果你觉得本文还不错的话也可以赞赏一点~


推荐书目:
JavaScript框架设计

评论
0条评论
还没有评论,大侠坐个沙发?