MySQL 条件查询进阶

背景

假如有一张表Table,有字段A、B,现在有需求如下:如果字段A为空,那么我将执行查询语句SQL1;如果字段A不为空,那么我将执行查询语句SQL2

如何实现

case…when…

由于会根据某字段的内容来执行不同的SQL语句,那么就可以使用流程条件查询。MySQL支持的流程条件查询有if...else...case... when...,这里我们选择后者。

其次,对于我们要查询的表进行一定的处理,在查询的时候新增一个临时字段temp,针对字段A的内容分别给临时字段赋值0、1、2或其他。

最后,我们在上一步的查询结果中根据临时字段temp来查询即可得到想要的结果。

实例实现

现在有一张表,如果字段sendSupplier_time为空,说明这条数据没有被推送;若不为空,说明这条数据已被推送。现在,我想要查询所有未被推送的数据。

1
2
3
4
5
6
SELECT * FROM
( SELECT *,
CASE WHEN sendSupplier_time IS NULL THEN 0 ELSE 1 END AS isSend
FROM qlj_businessplan ) AS a
WHERE
a.isSend = 0;

简单分析

  1. case…when…then…

    sendSupplier_time为空,给临时字段isSend赋值0,反之赋值1。

  2. 需要给括号中的查询结果给一个表名称(如上面代码的AS a),否则会报错。

结果

结果

choose…when…otherwise

将条件语句包裹在<choose>标签里,条件语句放在<when>标签里。我们直接上一段代码

1
2
3
4
5
6
7
8
9
10
11
12
<choose>
<when test="tImportUserFilter.appraisalStatus == 0">
AND t_import_user.talk_record != '' AND t_import_user.talk_record IS NOT NULL
</when>
<when test="tImportUserFilter.appraisalStatus == 1">
AND t_import_user.talk_record = '' OR t_import_user.talk_record IS NULL
</when>
<!-- otherwise条件可写可不写 -->
<otherwise>
... ...
</otherwise>
</choose>