0

理想情况下,第二个参数中给出的查询只应在第一个参数为空时为 NVL 执行以显示替代文本。但是在下面的查询中,当第一个参数不为空时,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 的第一个参数为空时,我将如何避免运行 NVL 的第二个参数中给出的查询。

4

1 回答 1

0

您可以COALESCE改用:

Oracle 数据库使用短路评估。数据库评估每个expr值并确定它是否是NULL,而不是expr在确定它们是否是之前评估所有值NULL

还有一个优点是它是标准 SQL,而不是专有的NVL.

于 2016-08-23T10:33:55.177 回答