有没有办法在 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
),您必须将其包含在 SRC
的 FROM
子句。
这意味着您在此 MERGE
语句中有两个 W_PURCH_COST_F
tables - 一个作为合并目标(您现在已经拥有),另一个作为“源” " 用于将它与 SRC
中的其他 table(s) 连接起来。那么使用 NVL
、CASE
或 DECODE
并做你想做的事就很简单了。
不过,我不太明白您将如何同时使用 FULFILLED_ON_DT
和 PO_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
但是,如果在 SRC
的 FROM
子句中使用,它 有效 :
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>
您可能要考虑的选项是:
嵌套NVL
:nvl(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
对我来说是更好的选择。
我在下面有一个合并语句,我想添加一个条件,如果 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
),您必须将其包含在 SRC
的 FROM
子句。
这意味着您在此 MERGE
语句中有两个 W_PURCH_COST_F
tables - 一个作为合并目标(您现在已经拥有),另一个作为“源” " 用于将它与 SRC
中的其他 table(s) 连接起来。那么使用 NVL
、CASE
或 DECODE
并做你想做的事就很简单了。
不过,我不太明白您将如何同时使用 FULFILLED_ON_DT
和 PO_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
但是,如果在 SRC
的 FROM
子句中使用,它 有效 :
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>
您可能要考虑的选项是:
嵌套
NVL
:nvl(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
对我来说是更好的选择。