[英]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.