出现场景
有时候我们想在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}),返回的也是用、隔开的字符串,如果是用逗号隔开的将、改为逗号即可