如何仅在oracle/sql中不为null时插入值?

如何仅在oracle/sql中不为null时插入值?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我是oracle 11g的新手 T1 Date_ Name Version Long Short 2013 AAA 1 70 如果我合并 2013 AAA 1 80 null然后T1中的行变为2013 AAA 1 80 null 如果我合并 2013 AAA 1 null 80然后T1中的行变为2013 AAA 1 70 80 这里的规则是将非空值合并到对应列中的T1。 我曾经 但我不知道如何在中添加条件。 请帮忙。谢谢 这里的[sic]规

我是oracle 11g的新手

T1

Date_    Name   Version  Long    Short
2013     AAA      1       70  
如果我合并
2013 AAA 1 80 null
然后T1中的行变为
2013 AAA 1 80 null
如果我合并
2013 AAA 1 null 80
然后T1中的行变为
2013 AAA 1 70 80
这里的规则是将非空值合并到对应列中的T1。 我曾经

但我不知道如何在中添加条件。 请帮忙。谢谢

这里的[sic]规则是将非null值合并到对应列中的T1

实现此规则的最简单方法是使用coalesce将源为null时的列值设置回其原始值

e、 g


*注意:sourceQuery的名称是虚构的,因为在问题中它被省略了

使用具有新值和旧值的NVL,所以您不会用空值覆盖现有字段。例如:

MERGE INTO T1
USING (SELECT '2013' DATE_, 'AAA' NAME, 1 VERSION, NULL LONG, 80 SHORT FROM DUAL) T2
ON (T1.DATE_ = T2.DATE_ AND T1.NAME = T2.NAME AND T1.VERSION = T2.VERSION)
WHEN NOT MATCHED THEN INSERT (DATE_, NAME, VERSION, LONG, SHORT)
VALUES (T2.DATE_, T2.NAME, T2.VERSION, T2.LONG, T2.SHORT)
WHEN MATCHED THEN UPDATE SET T1.LONG = NVL(T2.LONG, T1.LONG), T1.SHORT = NVL(T2.SHORT, T1.SHORT);

对空字段使用nvl,并用空格替换。例如nvl(Long,,)?数据类型不匹配。
SET t1.Long = COALESCE(sourceQuery.Long, t1.Long),
    t1.short = COALESCE(sourceQuery.short , t1.short )
MERGE INTO T1
USING (SELECT '2013' DATE_, 'AAA' NAME, 1 VERSION, NULL LONG, 80 SHORT FROM DUAL) T2
ON (T1.DATE_ = T2.DATE_ AND T1.NAME = T2.NAME AND T1.VERSION = T2.VERSION)
WHEN NOT MATCHED THEN INSERT (DATE_, NAME, VERSION, LONG, SHORT)
VALUES (T2.DATE_, T2.NAME, T2.VERSION, T2.LONG, T2.SHORT)
WHEN MATCHED THEN UPDATE SET T1.LONG = NVL(T2.LONG, T1.LONG), T1.SHORT = NVL(T2.SHORT, T1.SHORT);