tcbs_批量儲存過程_sql_case when_示例

wisdomone1發表於2012-06-08
昨天在分析貸款逾期儲存過程,碰到如下游標定義:
(CASE
          WHEN(CASE 
                    WHEN NVL(MM.ProdOrgYN, 'N') = 'Y' THEN 'Y' ELSE 'N' 
               END) = 'Y' 
              THEN 
                    CASE WHEN
                              pack_osi_util.IsBusDay_Org(AR.DueDate + NVL(AL.GraceDays, 0)) = 'Y' 
                                THEN 
                                       CASE WHEN
                                                   AR.DueDate + NVL(AL.GraceDays, 0) =
                                                   To_Date('2019-12-20', 'yyyy-mm-dd') THEN 'Y' ELSE 'N' 
                                       END 
                                ELSE CASE WHEN
                                                   pack_osi_util.GetBusDateForward_Org(AR.DueDate +
                                                                               NVL(AL.GraceDays, 0),
                                                                   1) =
                                                                    To_Date('2019-12-20', 'yyyy-mm-dd') THEN 'Y' ELSE 'N' 
                                     END 
                    END 
          ELSE 
               CASE WHEN
                        AR.DueDate + NVL(AL.GraceDays, 0) =
                                To_Date('2019-12-20', 'yyyy-mm-dd') THEN 'Y' ELSE 'N' END 
        END) = 'Y'


分析了大半天,
   小結:
         case when end也可用於where條件,以前我只用於select中
                                    case when可以多級巢狀,如:
                                            select 
                                                 case when (另一個case when表示式)='某個值'
                                                           case when end --其為子case when語句
         再次說明sql的博大精深,要努力啊

        
為了備記,特附上相關貸款逾期的遊標:





CURSOR curs_GetOverdueAccounts IS
        SELECT    ASA.AcctNbr,
                  ASA.SubAcctNbr,
                  ASA.BalTypCd,
                  AL.GraceDays
          FROM    Acct A,
                  AcctSubAcct ASA,
                  AcctLoan AL,
                  AcctRcvb AR,
                  RcvbStat RS,
                  MjMiAcctBalCatTyp MMBC,
                  MjMiAcctTyp MM--BBP修改對公日曆時增加
         WHERE    A.CurrAcctStatCd IN ( 'ACT',
                                        'NPFM')
           AND    A.AcctNbr = AR.AcctNbr
           AND    AL.AcctNbr = AR.AcctNbr
           /*BIBAOPING--修改對公日曆時註釋掉--Start:2010-09-27
           AND    ( AR.DueDate + AL.GraceDays >= cpdFromDate AND
                    AR.DueDate + AL.GraceDays <= cpdThruDate )
             BIBAOPING--修改對公日曆時註釋掉--end:2010-09-27       */
                    
                  /*THE RCVBSTATE IS PPD(Partially Paid) AND ACT(Active)*/
           AND    RS.RcvbStatCd = AR.CurrRcvbStatCd
           AND    RS.PaidYN = 'N'
           AND    ASA.AcctNbr = AR.AcctNbr
           AND    ASA.SubAcctNbr = AR.SubAcctNbr
                  /*THE FILTER OF ACCOUNTS THAT NOT CONFIG THE BALANCE TYPE*/
           AND    MMBC.MjAcctTypCd = A.MjAcctTypCd
           AND    MMBC.MiAcctTypCd = A.CurrMiAcctTypCd
           AND    MMBC.BalCatCd = ASA.BalCatCd
           AND    MMBC.BalTypCd = ASA.BalTypCd
          -- AND A.ACCTNBR=183903044990 --WFZ TEST
           --AND    MMBC.PaymentSeqNbr > 0
           /*BIBAOPING--修改對公日曆時增加--Start:2010-09-27*/
           AND MMBC.MjAcctTypCd=MM.MjAcctTypCd--BBP
           AND MMBC.MiAcctTypCd=MM.MiAcctTypCd--BBP

            /*BIBAOPING--修改對公日曆時增加--End:2010-09-27*/
           AND    (AR.AcctNbr,
                   AR.SubAcctNbr) IN(
                                SELECT    ACCTNBR,
                                          SubAcctNbr
                                  FROM    AcctSubAcct
                                 WHERE    BalCatCd=lcsBalCatCd_NOTE
                                   AND(                 /*NOTE/BAL:ODP/BAL|ODP/INT*/
                                          (BaltypCd=lcsBalTypCd_BAL
                                          AND AcctNbr IN(
                                                         SELECT ODPBALTABLE.AcctNbr
                                                           FROM (SELECT AcctNbr FROM AcctSubAcct where balcatcd=lcsBalCatCd_ODP and BaltypCd=lcsBalTypCd_BAL)ODPBALTABLE,
                                                                (SELECT AcctNbr FROM AcctSubAcct where balcatcd=lcsBalCatCd_ODP and BaltypCd=lcsBalTypCd_INT)ODPINTTABLE
                                                          WHERE ODPBALTABLE.AcctNbr=ODPINTTABLE.AcctNbr))
                                      OR                /*NOTE/INT:ODI/BAL|ODI/INT*/
                                          (BaltypCd=lcsBalTypCd_INT
                                          AND AcctNbr IN(
                                                         SELECT ODIBALTABLE.AcctNbr
                                                           FROM (SELECT AcctNbr FROM AcctSubAcct where balcatcd=lcsBalCatCd_ODI and BaltypCd=lcsBalTypCd_BAL)ODIBALTABLE,
                                                                (SELECT AcctNbr FROM AcctSubAcct where balcatcd=lcsBalCatCd_ODI and BaltypCd=lcsBalTypCd_INT)ODIINTTABLE
                                                          WHERE ODIBALTABLE.AcctNbr=ODIINTTABLE.AcctNbr))
                                       )
                                GROUP BY ACCTNBR,
                                         SubAcctNbr)
             /*BIBAOPING--修改對公日曆時增加--Start:2010-09-27*/
            AND (
            CASE WHEN (CASE WHEN NVL(MM.ProdOrgYN, 'N') = 'Y' THEN 'Y' ELSE 'N' END) = 'Y' THEN
                CASE WHEN pack_osi_util.IsBusDay_Org(AR.DueDate + NVL(AL.GraceDays,0)) = 'Y' THEN
                     CASE WHEN AR.DueDate + NVL(AL.GraceDays,0) = To_Date(in_EFFDATE,'yyyy-mm-dd') THEN 'Y' ELSE 'N' END
                ELSE
                     CASE WHEN pack_osi_util.GetBusDateForward_Org(AR.DueDate + NVL(AL.GraceDays,0), 1)=To_Date(in_EFFDATE,'yyyy-mm-dd')  THEN 'Y' ELSE 'N' END
                END
            ELSE 
                CASE WHEN AR.DueDate + NVL(AL.GraceDays,0) = To_Date(in_EFFDATE,'yyyy-mm-dd') THEN 'Y' ELSE 'N' END
            END
            ) = 'Y'
            /*BIBAOPING--修改對公日曆時增加--End:2010-09-27*/
           --AND  a.acctnbr in (200000683469) -- test for NRS

        GROUP BY  ASA.AcctNbr,
                  ASA.SubAcctNbr,
                  ASA.BalTypCd,
                  AL.GraceDays
        ORDER BY  ASA.AcctNbr,
                  ASA.SubAcctNbr;































































          






















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-732252/,如需轉載,請註明出處,否則將追究法律責任。

相關文章