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

问题描述

我在下面有一个合并语句,并且要添加以下条件:如果X_RECEIVED_ON_DT为null,它将使用FULFILLED_ON_DT和PO_CLOSED_DT中的日期(它们是TGT(目标表)中的列)填充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的{ {1}}子句。

这意味着您在此FROM语句中将有两个W_PURCH_COST_F表-一个作为合并目标(如您现在所拥有),另一个作为“源”,用于与其他表连接MERGE中的表格。然后,使用SRCNVLCASE做您想做的事情很简单。

不过,我不太了解您将如何同时使用DECODEFULFILLED_ON_DT,但希望您知道。


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

这行不通-您无法在PO_CLOSED_DT中引用TGT

SRC

但是,如果在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 的{​​{1}}子句中使用,它将有效

SRC

您可能要考虑的选项是:

  • 嵌套的FROMSQL> merge into emp e 2 using (select distinct d.deptno,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对我来说似乎是一个更好的选择。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...