根据另一个列的值更新列,该值也在更新

时间:2016-03-10 09:28:41

标签: sql-server

我希望用null更新A列。我还希望用null更新B列,但前提是它的值与A列的原始值相匹配。

Update MyTable
Set A=Null,
    B=Case When B=A Then Null Else B End

以上陈述是否有效?在评估时,Case语句中的A值是否已经为Null?更新的顺序是否重要?

有什么方法可以更好地写这个并避免在不需要时设置B = B?我需要在1个语句中执行此操作,因为实际查询很长且很复杂,涉及许多连接和子查询。

2 个答案:

答案 0 :(得分:1)

如果您只是将A放在A之前,那么您的查询应该没问题,因为订单确实很重要。有可能它也会像你写的一样工作,但我对此表示怀疑。

UPDATE MyTable
SET B = CASE WHEN A = B then null else B END,
    A = NULL

答案 1 :(得分:1)

要更新的列的顺序很重要:实际上,您还将获得 A 的原始值(即您将获得的值)尽管您在更新期间分配了值,但已删除虚拟表(如果您正在编写触发器)。

您可以使用此脚本轻松测试此内容,该脚本包含两个更新列的不同顺序的UPDATE:

CREATE TABLE Test
(
    Id INT PRIMARY KEY NOT NULL,
    X INT,
    Y INT
)

INSERT Test (Id, X, Y)
VALUES (1, 2, 3)
INSERT Test (Id, X, Y)
VALUES (4, 5, 6)

UPDATE Test
SET X = X + 1,
    Y = X
WHERE Id = 1

UPDATE Test
SET Y = X,
    X = X + 1
WHERE Id = 4

SELECT *
FROM Test

这里 SELECT 会返回:

Id  X   Y
1   3   2
4   6   5

正如您所看到的, Y 的更新值始终与原始 X 相同,尽管UPDATE的顺序不同。