Обновлять один столбец только при изменении любого другого столбца - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь создать оператор обновления на SQL Server, чтобы установить одну из карт по умолчанию, а все остальные - нет, однако, если у меня 3 карты и 1 карта установлена ​​по умолчанию, и теперь я хочу установить карту 2по умолчанию я получаю все 3 карты, установленные как обновленные, когда мне нужно установить только карты 1 и 2. В настоящее время я использую следующий запрос:

UPDATE Card
  SET                     
     ModifiedDateTimeUtc = @ModifiedDateTimeUtc,
     IsDefault = CASE WHEN Id = @CardId THEN 1 ELSE 0 END
  WHERE CustomerId = @CustomerId;

Мне нужно изменить этот запрос, чтобы только карты со значениямиобновленный get для установки новой измененной даты / времени.

PS, я не могу использовать триггеры в этой базе данных (к сожалению), поэтому мне нужно найти решение, используя «простой» оператор SQL.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Может быть, это можно написать другими способами, но вы можете сделать это следующим образом:

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;

Что должно сделать это? Если идентификатор совпадает с параметром, а старое значение перед обновлением равно 1, дата и время будут такими же, обновление не будет выполнено, иначе (означает, что старое значение = 0) будет обновлено. И то же самое для старого значения = 0 ...

0 голосов
/ 01 ноября 2019

Это то, что вы хотите?

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. В этом случае, однако, это новое значение для столбца, поэтому я думаю, что это чистое выражение логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...