理想情况下,第二个参数中给出的查询只应在NVL显示第一个参数为null时显示替换文本时执行。但是在下面的查询中,当第一个参数不为null时,NVL正在执行查询,并且由于在NVL的第二个参数查询中使用了list_agg,我得到字符串连接溢出错误。
SELECT NVL (tb1.related_account,
(SELECT DISTINCT LISTAGG (A.ac_no, ';') WITHIN GROUP (ORDER BY A.ac_no)
FROM ACVW_ALL_AC_ENTRIES A
WHERE tb1.trn_ref_no IS NOT NULL AND A.trn_ref_no = tb1.trn_ref_no AND A.trn_code = tb1.trn_code AND A.event = tb1.event AND A.ac_no <> TB1.AC_NO AND A.ac_branch = :param_branch)) FROM ACVW_ALL_AC_ENTRIES tb1
INNER JOIN sttb_account tb2 ON tb1.ac_no = tb2.AC_GL_NO
INNER JOIN gltm_glmaster tb3 ON tb1.AC_NO = tb3.gl_code
INNER JOIN ACTB_ACCBAL_HISTORY tb6 ON tb6.Account = TB1.AC_NO AND TB6.BKG_DATE = TB1.TRN_DT AND TB1.AC_BRANCH = TB6.BRANCH_CODE
LEFT OUTER JOIN DETB_RTL_TELLER tb4 ON tb1.TRN_REF_NO = tb4.TRN_REF_NO
-- AND TB1.TRN_DT=TB4.TRN_DT
INNER JOIN STTM_BRANCH tb5 ON tb1.AC_BRANCH = tb5.BRANCH_CODE
INNER JOIN sttm_trn_code ON sttm_trn_code.trn_code = tb1.TRN_CODE
LEFT OUTER JOIN swtb_txn_log ON SWTB_TXN_LOG.TRN_REF_NO = TB1.TRN_REF_NO WHERE CUST_GL = 'G' AND TB1.TRN_DT = :Dated AND AC_BRANCH IN (:param_branch) AND tb1.related_account IS NOT NULL
当NVL的第一个参数为null时,如何避免运行NVL的第二个参数中给出的查询。
答案 0 :(得分:0)
您可以改为使用COALESCE
:
Oracle数据库使用短路评估。数据库会评估每个
expr
值并确定它是否为NULL
,而不是在确定其中是否有expr
之前评估所有NULL
值。
它的优点还在于它是标准的SQL,而不是专有的NVL
。