SQL条件变化:CASE WHEN使用和适用场景

实际业务中,很多处理都要靠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 &amp;&amp; maps.param.name != ''">
            AND aio.name = #{maps.param.name}
        </if>

大概就是根据条件拼接不同的过滤条件,虽然看起来不够优美,不是查询效率等条件下最优解,但是在某些特定业务场景也是可以达到要求的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值