mysql 某列指定值靠前排序:order by 高级用法之case when

做项目的时候遇到特殊的排序,排序主要写sql语句进行排序

需求是:查询出的专员列表,根据用户找到相同街道然后找到相同社区>转介人数排序

数据库执行

方式一

SELECT * FROM td_street_commissioner order by (
    case when street_code='500103012' then 1 when org_code='001008003' then 2 ELSE 3 END),people_number desc;

case when 当street_code等于500103012的时候返回1 ,org_code等于"001008003"的时候返回2,都不满足前面条件的时候返回3,然后再按照case when返回的值排序

等同于:

方式二

SELECT street_code,org_code community_code,people_number,
case when street_code='500103012' then 1 when org_code='001008003' then 2 ELSE 3 END as sortCode
FROM td_street_commissioner
where hospital_id=6612275265143874816 and status=1 and logical_deletion=0
order by sortCode,people_number desc;

mybatis中执行

注意:在mybatis中用动态sql,order by 后面的条件需要用$,我开始用#传值报错

方式一

order by后面用#取值报错

    <select id="orderPage" resultMap="BaseResultMap">
        SELECT street_code,org_code,people_number FROM td_street_commissioner
        where hospital_id=#{req.hospitalId} and status=1 and logical_deletion=0
        order by (
            case when street_code=#{req.streetCode} then 1 when org_code=#{req.orgCode} then 2 ELSE 3 END),people_number desc
    </select>

执行结果:

 用$能正常取值

    <select id="orderPage" resultMap="BaseResultMap">
        SELECT street_code,org_code,people_number FROM td_street_commissioner
        where hospital_id=#{req.hospitalId} and status=1 and logical_deletion=0
        order by (
            case when street_code=${req.streetCode} then 1 when org_code=${req.orgCode} then 2 ELSE 3 END),people_number desc
    </select>

执行结果: 可以看到$取值是预编译的时候直接解析成sql语句,而#则是?占位符

上面用的是mybatis plus,后面用mybatis项目测试了一下,发现在mybatis中order by中可以用#取值;那问题就出在苞米豆上面,因为苞米豆分页拦截时对sql进行了处理

    <select id="selA" resultMap="AppDrugUseMasterResult">
        select date_format(dum.use_date,'%Y-%m') useDateMonth, dum.id,dum.drug_name,dum.frequency
        from drug_use_master dum
        order by (case when dum.frequency=#{state} then 1 ELSE 3 END)
    </select>

 方式二

用#能正常取值

    <select id="orderPage" resultMap="BaseResultMap">
        SELECT street_code,org_code community_code,people_number,
        case when street_code=#{req.streetCode} then 1 when org_code=#{req.orgCode} then 2 ELSE 3 END as sortCode
        FROM td_street_commissioner
        where hospital_id=#{req.hospitalId} and status=1 and logical_deletion=0
        order by sortCode,people_number desc
    </select>

执行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值