当第一个参数不为null时,Oracle正在执行NVL第二个参数查询

时间:2016-08-23 10:28:53

标签: sql oracle11g listagg

理想情况下,第二个参数中给出的查询只应在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的第二个参数中给出的查询。

1 个答案:

答案 0 :(得分:0)

您可以改为使用COALESCE

  

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

它的优点还在于它是标准的SQL,而不是专有的NVL