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)
为新的字段值。