我正在尝试在SQL Server上创建一条更新语句,以将其中一张卡设置为默认卡,将所有其他卡都设置为默认卡,但是,如果我有3张卡并且卡1设置为默认卡,现在我要设置卡2默认情况下,当我只应设置卡1和2时,将所有3张卡设置为更新。我当前正在使用以下查询:
UPDATE Card
SET
ModifiedDateTimeUtc = @ModifiedDateTimeUtc,
IsDefault = CASE WHEN Id = @CardId THEN 1 ELSE 0 END
WHERE CustomerId = @CustomerId;
我需要修改此查询,以便只有具有更新值的卡才能设置新的修改日期/时间。
PS,不幸的是,我无法在此数据库上使用触发器,因此我需要使用“简单” SQL语句找到解决方案。
答案 0 :(得分:1)
也许可以用其他方式编写,但是您可以这样做:
UPDATE Card
SET
ModifiedDateTimeUtc =
CASE WHEN Id = @CardId THEN
CASE WHEN IsDefault = 1 THEN ModifiedDateTimeUtc ELSE @ModifiedDateTimeUtc END
ELSE
CASE WHEN IsDefault = 0 THEN ModifiedDateTimeUtc ELSE @ModifiedDateTimeUtc END
END,
IsDefault = CASE WHEN Id = @CardId THEN 1 ELSE 0 END
WHERE CustomerId = @CustomerId;
该怎么办? 如果ID与参数相同,并且旧值在更新前为1,则日期时间将相同,不进行任何更新,否则(意味着旧值= 0)将被更新。与旧值= 0 ...
相同答案 1 :(得分:0)
这是您想要的吗?
UPDATE Card
SET ModifiedDateTimeUtc = @ModifiedDateTimeUtc,
IsDefault = (CASE WHEN Id = @CardId THEN 1 ELSE 0 END)
WHERE CustomerId = @CustomerId AND
IsDefault <> (CASE WHEN Id = @CardId THEN 1 ELSE 0 END);
通常,我不会在CASE
中重复一个WHERE
表达式。不过,在这种情况下,这是该列的新值,所以我认为这是逻辑的清晰表达。