实际业务中,很多处理都要靠SQL来维护,因为一旦业务复杂起来,真的是靠代码去判断过滤条件,真的会折磨死人,所以说SQL的学习真不能太放松,太忽视。
这里分享的就是,关于自己实际开发中根据不同的条件,如何去选择对应过滤条件CASE WHEN,但是有的时候简单,根据条件去查找,如 单纯的xxx = #{xxx.xxxx}并能满足要求,举个几个实际例子吧:
搭配其他函数做统计或者过滤
拿统计班级成绩不及格,良,优秀来做例子,CASE WHEN和SUM函数搭配
SELECT
E_CODE,
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS low_count -- 不及格人数
SUM(CASE WHEN (score >= 60 AND score < 80) THEN 1 ELSE 0 END) AS normal_count --良人数
SUM(CASE WHENscore >= 80 THEN 1 ELSE 0 END) AS good_count --优秀人数
FROM
TABLE score
除了SUM,还可以搭配日期函数,ISNULL等,来过滤或者统计数据。
根据情况转换不同的过滤搜索条件
还有一种是搭配条件,比如说有这么一个状态,如果这个状态是1,那他的过滤条件是 aaaa AND bbbb AND ccccc
但是如果是状态2的话又是另一种搜索过滤条件 ,dddd AND
eeeee AND ffffff。
再加上实际业务复杂一些,里面各种表关联各种连接,然后要支持多种维度多条件混合查询,再给你搞个分页什么的展示范围限制,你很难通过代码去过滤,即使能完成的话,维护起来也非常难受,那种酸爽也是没谁了。
这里我只展示mybaitis代码中的一部分
<if test="maps.employeeId != null">
AND CASE WHEN aio.no_use_asset_employee_join = 1 THEN ( aius.employee_id = #{maps.employeeId} OR aiod.employee_id = #{maps.employeeId} )
ELSE ( aius.employee_id = #{maps.employeeId} AND aiod.employee_id = #{maps.employeeId} ) END
</if>
<if test="maps.param.name != null && maps.param.name != ''">
AND aio.name = #{maps.param.name}
</if>
大概就是根据条件拼接不同的过滤条件,虽然看起来不够优美,不是查询效率等条件下最优解,但是在某些特定业务场景也是可以达到要求的。