宁武皇仁光九年锦文轩刻本《异闻录》载: 扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,潘镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。 溪始觉如梦,奔塘边,但见池水干涸,莲叶皆枯,塘中鲤亦不知所踪。 自始至终,未辨眉目,只记襟上层迭莲华,其色魅惑,似血着泪。 后有青岩居士闻之,叹曰:魑祟动情,必作灰飞。犹蛾之投火耳,非愚,乃命数也。 ————《锦鲤抄》

【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标签外面。

posted @ 2022-06-21 17:11  哒布溜  阅读(591)  评论(0编辑  收藏  举报