动态sql拼接

有时候的需求很繁琐,如果单纯的跟着写;

可能会一个service使用五六个sql的statment;

如果拼接动态sql的话就可能一个mapper里 方法就可以了,

相对应的,拼接的时候有些可能会拼错。

select tt.a,tt.b, #{c} as cc,tt.d,
        ylt.e as ylt 
        from
        (
        select
        <if test="adv != '999999'.toString()">
            ga.adm,
            <choose>
                <when test="adv == null or adv=='' or adv =='000000'.toString() ">
                    substr( tg.av,0, 2 )
                </when>
                <when test="adv.substring(2)=='0000'.toString() ">
                    substr( tg.adv, 0, 4 )
                </when>
                <when test="adv.substring(4) =='00'.toString() ">
                    tg.adv
                </when>
            </choose>
            AS adv,
        </if>
        <if test="adv == '999999'.toString()">
            '全国' as dv, '999999' as adv,
        </if>
        count(1) as total
        from tta tg
        <if test="adv != '999999'.toString()">
            inner JOIN ta ga
            <choose>
                <when test="dav == null or adv=='' or adv=='000000'.toString() ">
                    ON ga.adv = substr( tg.adv, 0, 2 ) || '0000'
                </when>
                <when test="adv.substring(2)=='0000'.toString() ">
                    ON ga.adv = substr( tg.adv, 0, 4 ) || '00'
                </when>
                <when test="adv.substring(4) =='00'.toString() ">
                    ON ga.av = tg.adv
                </when>
                <otherwise>
                    ON ga.adv = tg.adv
                </otherwise>
            </choose>
        </if>
        inner join (
        select st from tb so
        <where>sp=0
            <if test="f != null and f != ''">
                and so.f =#{f}
            </if>
        </where>
        ) bo on bo.st= tg.st
        inner JOIN td td ON td.st = g.st
        INNER JOIN tta tta ON tta.st = a.st  

可以看到,sql的拼接中大量运用 <choose><when>标签,

根据进入的条件,拼接不同的sql语句,

标签既会出现在from 之前,也可能出现在 join on 之后的链接条件中,

当然where之后也可以使用,亲测;

有了 choose when 妈妈再也不用担心,sql特别杂碎了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值