Oracle SQL更新查询仅在值为null时更新值
我有以下查询,其中仅当值为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; 尽管它可能会触发更新触发器,即使这些行
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