仅在其他任何列更改时更新一列

时间:2019-10-31 22:55:57

标签: sql sql-server sql-update

我正在尝试在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语句找到解决方案。

2 个答案:

答案 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表达式。不过,在这种情况下,这是该列的新值,所以我认为这是逻辑的清晰表达。