簡體   English   中英

如何在 PLSQL 的 Where 子句中使用 IF 條件?

[英]How to use IF Condition in Where Clause in PLSQL?

SELECT (RC.TRR_BASE_AMT/INV_DTLS.TRD_ROE) FC_AMT  ,RC.*, HD.TRH_TRANS_REF ,BG.BKG_REF ,BG.BKG_BLNUM ,S.VOY_OP_SCH_VOY_REF AS TRH_VOYAGE_REF ,HD.TRH_TRANS_DATE  
    FROM  TAB_TDL_FIN_TRANSRECO RC
    LEFT JOIN TAB_THD_FIN_TRANSHEAD HD ON  TRR_MATCH_REF = HD.TRH_TRANS_REF  AND TRR_COMP_CODE = TRH_COMP_CODE      
    LEFT JOIN (SELECT TRR_SEQ AS INV_RECO_SEQ, TRD_ROE , ASSET_EMP_ID
                FROM TAB_TDL_FIN_TRANSDTLS ID, TAB_TDL_FIN_TRANSRECO IR
                WHERE TRD_COMP_CODE = TRR_COMP_CODE
                AND TRD_TRANS_REF = TRR_TRANS_REF
                AND TRD_SEQ = TRR_TDL_SEQ
              ) INV_DTLS ON   RC.TRR_MATCH_SEQ = INV_DTLS.INV_RECO_SEQ                         
    LEFT JOIN TAB_THD_BKGHEAD BG ON  BG.BKG_REF = INV_DTLS.ASSET_EMP_ID 
    LEFT JOIN TAB_MDL_VOY_OPER_SCHEDULE S ON S.VOY_OP_SCH_ID = CASE WHEN BG.BKG_SHPMT_TYPE ='O' THEN BG.BKG_POL_VOY_ID ELSE BG.BKG_POD_VOY_ID END      
    WHERE TRR_TRANS_TYPE ='CT' AND TRR_DRCR_FLAG  ='D' AND TRR_COMP_CODE = P_COMPCODE
    AND TRR_TRANS_REF >= NVL( P_CTVRFROM, TRR_TRANS_REF) AND  TRR_TRANS_REF <= NVL( P_CTVRTO, TRR_TRANS_REF)   
    AND (
        ( P_BLNOS IS NULL )
        OR
        ( BG.BKG_BLNUM IN (SELECT COLUMN_VALUE   FROM TABLE( IN_LIST_CLOB( REPLACE(REPLACE(REPLACE(P_BLNOS,CHR(9),''),CHR(10),''),' ',''))) WHERE COLUMN_VALUE IS NOT NULL)    )    
       )
    AND NVL(S.VOY_OP_SCH_VOY_REF,'X') = NVL( P_VOYCODE , NVL(S.VOY_OP_SCH_VOY_REF,'X') )
    AND HD.TRH_TRANS_DATE >= NVL(TO_DATE(P_FROMDATE,'DD/MM/YYYY') ,HD.TRH_TRANS_DATE )
    AND HD.TRH_TRANS_DATE <=  NVL(TO_DATE(P_TODATE,'DD/MM/YYYY') ,HD.TRH_TRANS_DATE )
    AND IF RC.TRR_TRANS_TYPE = 'IN' THEN >= NVL(TO_DATE(P_FROMDATE,'DD/MM/YYYY') ,RC.TRR_TRANS_DT ) END IF
    AND RC.TRR_MAC =P_ACNTCODE

這是你的IF

AND IF RC.TRR_TRANS_TYPE = 'IN' THEN >= NVL(TO_DATE(P_FROMDATE,'DD/MM/YYYY') ,RC.TRR_TRANS_DT ) END IF

其內容為:如果某個值是IN ,則某些值必須>=而不是某個日期。 那“東西”是什么? 您在該行上方使用的是HD.TRH_TRANS_DATE嗎? 讓我們假設它是; 然后 - 而不是IF (這是一個 PL/SQL 條件) - 使用CASE表達式,例如

and HD.TRH_TRANS_DATE >= case when rc.trr_trans_type = 'IN' then 
                                NVL(TO_DATE(P_FROMDATE,'DD/MM/YYYY') ,RC.TRR_TRANS_DT )
                              else trunc(sysdate)
                         end

只需使用AND

SELECT RC.TRR_BASE_AMT/INV_DTLS.TRD_ROE AS FC_AMT,
       RC.*,
       HD.TRH_TRANS_REF,
       BG.BKG_REF,
       BG.BKG_BLNUM,
       S.VOY_OP_SCH_VOY_REF AS TRH_VOYAGE_REF,
       HD.TRH_TRANS_DATE  
FROM   TAB_TDL_FIN_TRANSRECO RC
       LEFT JOIN TAB_THD_FIN_TRANSHEAD HD
       ON (   TRR_MATCH_REF = HD.TRH_TRANS_REF
          AND TRR_COMP_CODE = TRH_COMP_CODE )
       LEFT JOIN (
         SELECT TRR_SEQ AS INV_RECO_SEQ,
                TRD_ROE,
                ASSET_EMP_ID
         FROM   TAB_TDL_FIN_TRANSDTLS ID
                INNER JOIN TAB_TDL_FIN_TRANSRECO IR
                ON (   TRD_COMP_CODE = TRR_COMP_CODE
                   AND TRD_TRANS_REF = TRR_TRANS_REF
                   AND TRD_SEQ = TRR_TDL_SEQ
                )
       ) INV_DTLS
       ON RC.TRR_MATCH_SEQ = INV_DTLS.INV_RECO_SEQ                         
       LEFT JOIN TAB_THD_BKGHEAD BG
       ON  BG.BKG_REF = INV_DTLS.ASSET_EMP_ID 
       LEFT JOIN TAB_MDL_VOY_OPER_SCHEDULE S
       ON S.VOY_OP_SCH_ID = CASE
                            WHEN BG.BKG_SHPMT_TYPE ='O'
                            THEN BG.BKG_POL_VOY_ID
                            ELSE BG.BKG_POD_VOY_ID
                            END      
WHERE  TRR_TRANS_TYPE ='CT'
AND    TRR_DRCR_FLAG  ='D'
AND    TRR_COMP_CODE = P_COMPCODE
AND    (  TRR_TRANS_REF >= P_CTVRFROM
       OR (P_CTVRFROM IS NULL AND TRR_TRANS_REF IS NOT NULL))
AND    (  TRR_TRANS_REF <= P_CTVRTO
       OR (P_CTVRTO IS NULL AND TRR_TRANS_REF IS NOT NULL))
AND    (
          P_BLNOS IS NULL
       OR BG.BKG_BLNUM IN (
            SELECT COLUMN_VALUE
            FROM   TABLE(IN_LIST_CLOB(TRANSLATE(P_BLNOS,'X '||CHR(9)||CHR(10),'X')))
            WHERE  COLUMN_VALUE IS NOT NULL
          )
       )
AND    (  S.VOY_OP_SCH_VOY_REF = P_VOYCODE
       OR (P_VOYCODE IS NULL AND S.VOY_OP_SCH_VOY_REF IS NOT NULL))
AND    (  HD.TRH_TRANS_DATE >= TO_DATE(P_FROMDATE,'DD/MM/YYYY')
       OR (P_FROMDATE IS NULL AND HD.TRH_TRANS_DATE IS NOT NULL))
AND    (  HD.TRH_TRANS_DATE <=  TO_DATE(P_TODATE,'DD/MM/YYYY')
       OR (P_TODATE IS NULL AND HD.TRH_TRANS_DATE IS NOT NULL))
AND    RC.TRR_TRANS_TYPE = 'IN'
AND    something >= NVL(TO_DATE(P_FROMDATE,'DD/MM/YYYY') ,RC.TRR_TRANS_DT )
AND    RC.TRR_MAC =P_ACNTCODE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM