我希望用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个语句中执行此操作,因为实际查询很长且很复杂,涉及许多连接和子查询。
答案 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的顺序不同。