Oracle:有没有一种简单的方法在合并/更新语句中说"如果null保留当前值"?

时间:2020-03-06 14:33:26  来源:igfitidea点击:

我对oracle的任何更高级的功能都了解甚少,但是我认为这是可能的。

说我有一个具有以下架构的表:

MyTable
  Id INTEGER,
  Col1 VARCHAR2(100),
  Col2 VARCHAR2(100)

我想用以下代码编写一个存储过程

PROCEDURE InsertOrUpdateMyTable(p_id in integer, p_col1 in varcahr2, p_col2 in varchar2)

在更新的情况下,如果p_col1,p_col2中的值为null,则不会分别覆盖Col1,Col2

因此,如果我有记录:

id=123, Col1='ABC', Col2='DEF'

exec InsertOrUpdateMyTable(123, 'XYZ', '098'); --results in id=123, Col1='XYZ', Col2='098'
exec InsertOrUpdateMyTable(123, NULL, '098');  --results in id=123, Col1='ABC', Col2='098'
exec InsertOrUpdateMyTable(123, NULL, NULL);   --results in id=123, Col1='ABC', Col2='DEF'

有没有多个SQL语句的简单方法吗?

我在想也许可以通过Merge语句来做到这一点,尽管我只是稍微熟悉一下。

编辑:
卡德·鲁(Cade Roux)波纹管建议使用COALESCE,效果很好!以下是使用合并kewyord的一些示例。
这是我的问题的解决方案:

MERGE INTO MyTable mt
    USING (SELECT 1 FROM   DUAL) a
    ON (mt.ID = p_id)
    WHEN MATCHED THEN
        UPDATE
           SET mt.Col1 = coalesce(p_col1, mt.Col1), mt.Col2 = coalesce(p_col2, mt.Col2)
    WHEN NOT MATCHED THEN
        INSERT (ID, Col1, Col2)
        VALUES (p_id, p_col1, p_col2);

解决方案

使用MERGE和COALESCE?尝试此链接作为示例

SET a.Col1 = COALESCE(incoming.Col1, a.Col1)
    ,a.Col2 = COALESCE(incoming.Col2, a.Col2)

更改要使用的呼叫或者更新语句

nvl(newValue, oldValue)

为新的字段值。