sql - 仅当任何其他列更改时才更新一列
问题描述
我正在尝试在 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;
我需要修改此查询,以便只有值更新的卡片才能设置新的修改日期/时间。
PS,我不能在这个数据库上使用触发器(很遗憾),所以我需要使用“简单”的 SQL 语句找到解决方案。
解决方案
也许它可以用其他方式编写,但你可以这样做:
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,则 datetime 相同,不进行更新,否则(表示旧值 = 0)则更新。旧值 = 0 也是如此...
推荐阅读
- docker-compose - 如何在运行 docker 容器时修复错误
- core-data - 使用 SwiftUI 和 CoreData 的数据
- excel - EXCEL 计算非连续范围内的非空行
- python - 按键对列表中的记录进行排序
- variables - 如何使用执行期间生成的变量动态设置 Ansible playbook 中的 hosts 字段?
- node.js - 如何将数据从 React 发送到 Express
- php - 无法删除选择列表
- flutter - Flutter-web TextFormField 问题
- arrays - 使用条件获取另一列的条目
- node.js - 如何创建接受插件的节点项目