sql - mybatis的動態字段insert和IFNULL結合where使用實踐


有一個業務sql,它有一些任性,它還有一點麻煩.

 

首先這個sql的業務通過搜索到該條目上個時間點的一個字段的值,填充回要插入的數據的字段

 

整體是要根據不同的物品名或其他判定字段,來進行新插入數據的期初數量的填充

這里比如上圖 ID 5 的籃球的期初數量是根據上一個時間點的結余數量來填充的

而不能是ID 1羽毛球的結余數量3,也不能是ID 3的不是挨着的上個時間點的結余5

這樣再去統計庫存的不同時間段區間搜索時就有效了

通過統計不同時間區間的GROUP BY下的物品,來看這個區間的庫存量(包含上一個時間的期初數量)

所以上圖中,如果搜索到的時間點是介於包含ID4,5,那么當時獲取的期初庫存就是5,即該物品的ID3時候的結余量

 

測試通過的SQL:

    <!--物料日志表,這些是可以重復物料名稱(mingchengguige)的子數據(詳細)-->
    <!--其中期初庫存字段插入時,不用判斷是否為空,值為寫好的子sql,-->
    <!--fachuleixing根據正常發出(出庫單),破損發出(破損單),維修發出(維修單)-->
    <!--qichukucun和jieyushuliang不需要判定為空與否,直接新增(首先進行了計算)-->
    <insert id="insertSelective" keyColumn="id" keyProperty="id"
            parameterType="com.tansuo365.test1.bean.WuliaoKucunRiZhi" useGeneratedKeys="true">
        insert into wuliaokucunrizhi
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="mingchengguige != null">
                mingchengguige,
            </if>
            qichukucun,
            <if test="shourushuliang != null">
                shourushuliang,
            </if>
            <if test="fachushuliang != null">
                fachushuliang,
            </if>
            <if test="tuihuishuliang != null">
                tuihuishuliang,
            </if>
            jieyushuliang,
            <if test="jiagongyigong != null">
                jiagongyigong,
            </if>
            <if test="danwei != null">
                danwei,
            </if>
            <if test="wuliaobianma != null">
                wuliaobianma,
            </if>
            <if test="dalei != null">
                dalei,
            </if>
            <if test="rukukufang != null">
                rukukufang,
            </if>
            <if test="xiangmuweihu != null">
                xiangmuweihu,
            </if>
            <if test="fachuleixing != null">
                fachuleixing,
            </if>
            <if test="createtime != null">
                createtime,
            </if>
            <if test="updatetime != null">
                updatetime,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="mingchengguige != null">
                #{mingchengguige},
            </if>
            IFNULL((select jie.jieyushuliang from
            (select jieyushuliang from wuliaokucunrizhi
            <where>
                <if test="mingchengguige != null and mingchengguige != ''">
                    and mingchengguige = #{mingchengguige}
                </if>
                <if test="rukukufang != null and rukukufang != '' ">
                    and rukukufang = #{rukukufang}
                </if>
                <if test="dalei != null and dalei != '' ">
                    and dalei = #{dalei}
                </if>
                <if test="xiangmuweihu != null and xiangmuweihu != '' ">
                    and xiangmuweihu = #{xiangmuweihu}
                </if>
               and createtime &lt; (select now())
            </where>
            order by createtime desc limit 1) jie),0),
            <if test="shourushuliang != null">
                #{shourushuliang},
            </if>
            <if test="fachushuliang != null">
                #{fachushuliang},
            </if>
            <if test="tuihuishuliang != null">
                #{tuihuishuliang},
            </if>
                IFNULL((select jie.jieyushuliang from
                (select jieyushuliang from wuliaokucunrizhi where createtime &lt;(select now())
                order by createtime desc limit 1) jie),0)
                +IFNULL(#{shourushuliang},0)
                 -IFNULL(#{fachushuliang},0)
                +IFNULL(#{tuihuishuliang},0),
            <if test="jiagongyigong != null">
                #{jiagongyigong},
            </if>
            <if test="danwei != null">
                #{danwei},
            </if>
            <if test="wuliaobianma != null">
                #{wuliaobianma},
            </if>
            <if test="dalei != null">
                #{dalei},
            </if>
            <if test="rukukufang != null">
                #{rukukufang},
            </if>
            <if test="xiangmuweihu != null">
                #{xiangmuweihu},
            </if>
            <if test="fachuleixing != null">
                #{fachuleixing},
            </if>
            <if test="createtime != null">
                #{createtime},
            </if>
            <if test="updatetime != null">
                #{updatetime},
            </if>
        </trim>
    </insert>

 

注意其中的

 IFNULL((select jie.jieyushuliang from
            (select jieyushuliang from wuliaokucunrizhi
            <where>
                <if test="mingchengguige != null and mingchengguige != ''">
                    and mingchengguige = #{mingchengguige}
                </if>
                <if test="rukukufang != null and rukukufang != '' ">
                    and rukukufang = #{rukukufang}
                </if>
                <if test="dalei != null and dalei != '' ">
                    and dalei = #{dalei}
                </if>
                <if test="xiangmuweihu != null and xiangmuweihu != '' ">
                    and xiangmuweihu = #{xiangmuweihu}
                </if>
               and createtime &lt; (select now())
            </where>
            order by createtime desc limit 1) jie),0),

這段代碼是獲取上個時間點的結余數量作為新數據的期初庫存數量的

同時還有jieyushuliang

            jieyushuliang,

 

而這段代碼是計算了當時的結余數量

                IFNULL((select jie.jieyushuliang from
                (select jieyushuliang from wuliaokucunrizhi where createtime &lt;(select now())
                order by createtime desc limit 1) jie),0)
                +IFNULL(#{shourushuliang},0)
                 -IFNULL(#{fachushuliang},0)
                +IFNULL(#{tuihuishuliang},0),

 

在下面代碼

    <insert id="insertSelective" keyColumn="id" keyProperty="id"
            parameterType="com.tansuo365.test1.bean.WuliaoKucunRiZhi" useGeneratedKeys="true">
        insert into wuliaokucunrizhi
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="mingchengguige != null">
                mingchengguige,
            </if>
            qichukucun,

這里沒有進行qichukucun字段的判空,而直接會選定這個字段要進行數據插入

 

執行結果

==>  Preparing: insert into wuliaokucunrizhi ( mingchengguige, qichukucun, shourushuliang, jieyushuliang, jiagongyigong, danwei, wuliaobianma, dalei, rukukufang, xiangmuweihu ) values ( ?, IFNULL((select jie.jieyushuliang from (select jieyushuliang from wuliaokucunrizhi WHERE mingchengguige = ? and rukukufang = ? and dalei = ? and xiangmuweihu = ? and createtime < (select now()) order by createtime desc limit 1) jie),0), ?, IFNULL((select jie.jieyushuliang from (select jieyushuliang from wuliaokucunrizhi where createtime <(select now()) order by createtime desc limit 1) jie),0) +IFNULL(?,0) -IFNULL(?,0) +IFNULL(?,0), ?, ?, ?, ?, ?, ? ) 
==> Parameters: 甲板(String), 甲板(String), A(String), 甲類(String), 甲項目1(String), 3.0(Double), 3.0(Double), null, null, 甲供(String), 噸(String), jb1101(String), 甲類(String), A(String), 甲項目1(String)
<==    Updates: 1

 

注意在這里的數值在數據庫中都設定了默認值0

在獲取不到期初庫存(比如該物品第一條),和其它的字段數值時,會默認填0,也利於了結余的計算

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM