【Oracle 中foreach 与choose组合使用】
Oracle相关
- < foreach> 与 < choose> 组合使用实现sql遍历
业务背景:前端的单选框改为多选,传递值也通过逗号拼接成字符串传到后端,
这个时候需求类型可能会有两种,第一种是前端传递的是后端字段值,比如name为字段名,"张三"就是字段值,我们用in查询即可,注意,Oracle 的in长度不会超过1000(当然,前端多选一般数量很少)
<if test="lineIdList != null and lineIdList.size() != 0">
and LINE.ACC_PAYABLE_ID in
<foreach collection="lineIdList" item="payableLineId" open="(" separator="," close=")">
#{payableLineId}
</foreach>
</if>
这种写法就相当于 select a from line where line.ACC_PAYABLE_ID in ('张三',‘bgff’);
上面的对应 line.ACC_PAYABLE_ID in (''张三'',"bgff") 这部分,lineIdList 则是List< Long> 的形式,里面存的多个行id。
第二种则是相反,前端传的是字段名,不是字段值,比如我现在要查询多个时间段,有半年内,半年到一年,一年到两年等等,前端传递的通常是 halfYear,oneYear这种字段名对应code,偏偏后台数据库是把账龄金额存储在对应的字段内(反人类设定),这个时候可以这样写:不要用逗号分割,用OR 分割形成多个 choose - when ,每个choose when都可以用于匹配对应的字段
<if test="agingList != null and agingList.size() != 0">
AND
<foreach collection="agingList" item="agingDaysPe" open="(" separator=" OR " close=")">
<choose>
<when test='agingDaysPe == "halfYear"'>
LINE.AGING_IN_HALF_YEAR is not null
</when>
<when test='agingDaysPe == "oneYear"'>
LINE.AGING_HALF_TO_YEAR is not null
</when>
<when test='agingDaysPe == "twoYear"'>
LINE.AGING_ONE_TO_TWO is not null
</when>
<when test='agingDaysPe == "threeYear"'>
LINE.AGING_TWO_TO_THREE is not null
</when>
<when test='agingDaysPe == "fourYear"'>
LINE.AGING_THREE_TO_FOUR is not null
</when>
<when test='agingDaysPe == "fiveYear"'>
LINE.AGING_FOUR_TO_FIVE is not null
</when>
<when test='agingDaysPe == "moreThan"'>
LINE.AGING_OVER_FIVE is not null
</when>
</choose>
</foreach>
</if>
agingList 是一个List< String>,里面存的是 halfYear 这种字段名,对应表内字段为AGING_IN_HALF_YEAR,以此类推,前端传递 halfYear,oneYear时 后端就查询返回 halfYear,oneYear这两个字段有值的数据行,即账龄金额所在时间区间。
foreach的separator除了逗号外还可以填入很多东西,比如 AND,OR,甚至UNION ALL (foreach里面写的是select语句),如果出现报错:表达式缺失,那就看一下and,or这些标识符位置是否正确,比如我之前用逗号进行 分割,发现一直报错 “badsql,表达式缺失”,后来换成 separator=" OR " 也报错,发现应该把and 放在foreach标签外面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统