【问题标题】:Doing a MERGE without replacing null values in Oracle在不替换 Oracle 中的空值的情况下进行 MERGE
【发布时间】:2020-01-02 00:42:48
【问题描述】:

我需要对表格进行更新。

使用 Oracle。

  1. 我创建了一个临时表,它的列与原始表相同。
  2. 我想将临时表合并到原始表中,但不替换临时表中的空值,即:

表1:

Id, First_Name, Last_Name, Salary
123, Bob, Foo, 100

表2:

Id, First_Name, Last_Name, Salary
123, NULL, NULL, 200

合并后:

表1:

Id, First_Name, Last_Name, Salary
123, Bob, Foo, 200

我尝试构建这个:

MERGE INTO t1 wu USING t2 tmp ON (wu.Id = tmp.Id) WHEN MATCHED THEN
CASE WHEN tmp.First_Name IS NOT NULL THEN
UPDATE SET wu.First_Name = tmp.First_Name 
ELSE
UPDATE SET wu.First_Name = wu.First_Name
END
CASE WHEN tmp.Last_Name IS NOT NULL THEN
UPDATE SET wu.Last_Name = tmp.Last_Name 
ELSE
UPDATE SET wu.Last_Name = wu.Last_Name 
END
CASE WHEN tmp.Salary IS NOT NULL THEN
UPDATE SET wu.Salary = tmp.Salary 
ELSE
UPDATE SET wu.Salary = wu.Salary 
END
WHEN NOT MATCHED THEN
INSERT VALUES(tmp.Id, tmp.First_Name, LastName, tmp.Salary);

但我明白了:

ORA-00927: missing equal sign

我不想直接使用 PL/SQL - 全部来自 c#。

【问题讨论】:

  • MERGE statement's syntax 非常严格。 WHEN MATCHED THEN 只能有一个UPDATE 子句和一个可选的DELETE 子句。在 UPDATE 的 SET 子句中,您可以执行 CASE 表达式。
  • @madreflection 可以根据我写的代码举个例子吗?
  • 不。 @Littlefoot 提供了比我更好的答案。我本来打算建议COALESCE。不过,NVL 对于 Oracle 来说可能更惯用。

标签: c# sql oracle merge


【解决方案1】:

NVL 可能会有所帮助。

测试用例:

SQL> create table t1 (id number, first_name varchar2(10),
  2    last_name varchar2(10), salary number);

Table created.

SQL> create table t2 (id number, first_name varchar2(10),
  2    last_name varchar2(10), salary number);

Table created.

SQL> insert all
  2    into t1 values (123, 'Bob', 'Foo', 100)
  3    into t2 values (123, null, null, 200)
  4    into t2 values (555, 'Little', 'Foot', 20)
  5  select * From dual;

3 rows created.

合并:

SQL> merge into t1 using t2 on (t1.id = t2.id)
  2  when matched then update set
  3    t1.first_name = nvl(t2.first_name, t1.first_name),
  4    t1.last_name  = nvl(t2.last_name , t1.last_name),
  5    t1.salary     = nvl(t2.salary    , t1.salary)
  6  when not matched then insert
  7    values (t2.id, t2.first_name, t2.last_name, t2.salary);

2 rows merged.

结果:

SQL> select * from t1 order by id;

        ID FIRST_NAME LAST_NAME      SALARY
---------- ---------- ---------- ----------
       123 Bob        Foo               200
       555 Little     Foot               20

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多