有没有办法在 MERGE oracle sql 中包含 CASE WHEN 或 NVL?

Is there a way to include CASE WHEN or NVL in MERGE oracle sql?

我在下面有一个合并语句,我想添加一个条件,如果 X_RECEIVED_ON_DT 为空,它将使用 FULFILLED_ON_DT 和 PO_CLOSED_DT 中的日期,它们是列在 TGT(目标 table)中填充 TGT.X_GAAP_EXCH_RATE_WID 列

 MERGE
/*+ PARALLEL(8) */
INTO W_PURCH_COST_F TGT USING
(SELECT
  /*+ PARALLEL(8) */
  cost.INTEGRATION_ID,
  cost.X_RECEIVED_ON_DT,
  cost.LOC_CURR_CODE,
  COALESCE(gaap.ROW_WID,0) X_GAAP_EXCH_RATE_WID
FROM W_Purch_Cost_F_3955 cost
JOIN W_DAY_D wday
ON TRUNC(cost.X_RECEIVED_ON_DT)=TRUNC(wday.CALENDAR_DATE)
LEFT OUTER JOIN WC_GAAP_EXCH_RATE_G gaap
ON gaap.PERIOD               =wday.PER_NAME_ENT_PERIOD
AND cost.LOC_CURR_CODE       =gaap.FROM_CURCY_CD
) SRC ON (TGT.INTEGRATION_ID = SRC.INTEGRATION_ID AND TGT.DATASOURCE_NUM_ID = 310)
WHEN MATCHED THEN
  UPDATE SET TGT.X_GAAP_EXCH_RATE_WID = SRC.X_GAAP_EXCH_RATE_WID;

如果您想在 source 查询中引用 W_PURCH_COST_F(别名 TGT),您必须将其包含在 SRCFROM 子句。

这意味着您在此 MERGE 语句中有两个 W_PURCH_COST_F tables - 一个作为合并目标(您现在已经拥有),另一个作为“源” " 用于将它与 SRC 中的其他 table(s) 连接起来。那么使用 NVLCASEDECODE 并做你想做的事就很简单了。

不过,我不太明白您将如何同时使用 FULFILLED_ON_DTPO_CLOSED_DT,但我希望您知道。


示例基于 Scott 的架构(因为我没有您的 tables):

这行不通 - 您不能在 SRC 中引用 TGT:

SQL> merge into emp e
  2  using (select distinct d.deptno, d.dname, d.loc
  3         from dept d
  4         where d.deptno = e.deptno                --> not allowed
  5        ) x
  6  on (e.deptno = x.deptno)
  7  when matched then update set e.ename = x.loc;
       where d.deptno = e.deptno
                        *
ERROR at line 4:
ORA-00904: "E"."DEPTNO": invalid identifier

但是,如果在 SRCFROM 子句中使用,它 有效 :

SQL> merge into emp e
  2  using (select distinct d.deptno, d.dname, d.loc
  3         from dept d join emp a on a.deptno = d.deptno
  4        ) x
  5  on (e.deptno = x.deptno)
  6  when matched then update set e.ename = x.loc;

14 rows merged.

SQL>

您可能要考虑的选项是:

  • 嵌套NVLnvl(x_received_on_dt, nvl(fulfilled_on_dt, po_closed_dt))

  • coalesce(returns第一个non-null值):

    coalesce(x_received_on_dt, fulfilled_on_dt, po_closed_dt, sysdate) 
    

coalesce 对我来说是更好的选择。