【发布时间】:2020-01-02 00:42:48
【问题描述】:
我需要对表格进行更新。
使用 Oracle。
- 我创建了一个临时表,它的列与原始表相同。
- 我想将临时表合并到原始表中,但不替换临时表中的空值,即:
表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 来说可能更惯用。