关于mybatis in排序的处理方案

出现场景

有时候我们想在mybatis里面使用in,功能是可以实现,但是查询出来的顺序确不是我们想要的

方案1

当我们使用in时,我们为了让它按着in 里面的顺序查询出来,可以在mybaits里面使用field,代码如下

  select dsc
        from elh_cd
        where 1=1
        and id in
        <foreach item="id" index="index" collection="idList"
                 open="(" separator="," close=")">
            #{id}
        </foreach>
        ORDER BY FIELD(id, <foreach collection="idList" item="id" separator=",">#{id}</foreach>)

有时候field并不支持,我们可以改用DECODE,代码如下

  select dsc
        from elh_cd
        where 1=1
        and id in
        <foreach item="id" index="index" collection="idList"
                 open="(" separator="," close=")">
            #{id}
        </foreach>
  ORDER BY DECODE(id,
        <foreach collection="idList" index="index" item="id" open=""
                 separator="," close="">
            #{id},#{index}
        </foreach>```

方案2

使用LISTAGG, 只有oracle11后才支持LISTAGG,具体代码实现

 SELECT #{ids,jdbcType=VARCHAR},
                    LISTAGG(cd.dsc, '、') WITHIN GROUP (ORDER BY instr('、'||
                    #{ids,jdbcType=VARCHAR}||'、', '、'||cd.CD||'、'))
                 AS ccyCodeNm
             from ELH_CD cd
             where  instr('、'||#{ids,jdbcType=VARCHAR}||'、'
                 , '、'||cd.CD||'、')
                 > 0
             GROUP BY #{ids,jdbcType=VARCHAR}
这个只需要传用、号隔开的字符串即可(#{ids,jdbcType=VARCHAR}),返回的也是用、隔开的字符串,如果是用逗号隔开的将、改为逗号即可
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值