Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL更新查询仅在值为null时更新值_Sql_Oracle - Fatal编程技术网

Oracle SQL更新查询仅在值为null时更新值

Oracle SQL更新查询仅在值为null时更新值,sql,oracle,Sql,Oracle,我有以下查询,其中仅当值为null时才更新值 是否有可能将所有这些都放在一个查询中 UPDATE test SET test1 = 'hello' WHERE test1 IS NULL 及 你可以试试: UPDATE test SET test1 = NVL(test1, 'hello'), test2 = NVL(test2, 'world') WHERE test2 IS NULL OR test1 IS NULL; 尽管它可能会触发更新触发器,即使这些行

我有以下查询,其中仅当值为null时才更新值

是否有可能将所有这些都放在一个查询中

UPDATE test
SET test1 = 'hello'
WHERE test1 IS NULL

你可以试试:

UPDATE test
   SET test1 = NVL(test1, 'hello'),
       test2 = NVL(test2, 'world')
 WHERE test2 IS NULL
    OR test1 IS NULL;
尽管它可能会触发更新触发器,即使这些行实际上没有更改

UPDATE test
   SET test1 = COALESCE(test1, 'hello')
     , test2 = COALESCE(test2, 'hello')
 WHERE test1 IS NULL OR test2 IS NULL

在这种情况下,COALESCE()的工作原理与NVL()类似——返回第一个非空值。

因此,如果test1为null,则只更新test1;如果test2=“abc”?@Tom,则只更新test1,而不考虑test2中(或不在test2中)的内容。在这种情况下,我还需要where吗?。。。我当然会添加一个
,其中user_id='myuserid'
从技术上讲,如果test1不为null,它会更新test1,但它会将其设置为当前值。这就是为什么触发器会成为一个问题。即使您正在将列更新为其当前值,它们也将触发。如果不包括
WHERE
子句来测试空值,则test1和test2都不为空的行将不需要更新。无论您使用COALESCE还是NVL,触发器问题都将相关。IMHO COALESCE对于一个简单的空测试来说是过分的。我选择COALESCE而不是NVL的唯一原因是它是标准的,而后者不是。无论哪种方式我都可以。:)你能定义“标准”吗?我相信NVL已经被甲骨文使用了很长一段时间,这是甲骨文的问题。对不起,ANSI标准。另外,NVL计算两个参数,而COALESCE返回第一个非null,仅计算到该点。我喜欢NVL计算两个参数并仅合并到第一个非null的观点。对于这个问题,barel是显而易见的,但是对于NVL或类似的子查询,它可能会更有效。
UPDATE test
SET Test1 = COALESCE(test1, 'hello'),
    Test2 = COALESCE(test2, 'world')
WHERE test1 IS NULL OR
      test2 IS NULL
UPDATE test
SET Test1 = COALESCE(test1, 'hello'),
    Test2 = COALESCE(test2, 'world')
WHERE test1 IS NULL OR
      test2 IS NULL