sql - 如何用用例构造条件更新
问题描述
我必须写一个更新查询。如果special_member
帐户没有被取消,那么在该where
条款中,我必须通过在到期日期上添加 15 天的宽限期来使用此条件,并将其与今天的日期进行比较:
Convert(date,MEMBER_EXPIRY_DATE + 15) >= Convert(date,GETDATE())
如果会员资格被取消,那么我必须将实际到期日期与今天的日期进行比较。这是我的完整查询:
UPDATE SPECIAL_MEMBER SET SAVINGS_PERCENT = 10, ORDER_COUNT = 1
WHERE SPECIAL_MEMBER = '4382' AND CASE WHEN (CANCELLED = 0) THEN
Convert(date,MEMBER_EXPIRY_DATE + 15) >= Convert(date,GETDATE())
ELSE (Convert(date,MEMBER_EXPIRY_DATE) >= Convert(date,GETDATE())) END
当我执行它时,我得到:
'>' 附近的语法不正确。
解决方案
它是一个case
表达式,而不是一个语句,因此它只能返回一个值,即不能包含任何条件。只需将您要比较的值移到case
例如之外
UPDATE SPECIAL_MEMBER SET
SAVINGS_PERCENT = 10
, ORDER_COUNT = 1
WHERE SPECIAL_MEMBER = '4382'
AND CASE WHEN CANCELLED = 0
THEN CONVERT(DATE,DATEADD(DAY,15,MEMBER_EXPIRY_DATE))
ELSE CONVERT(DATE,MEMBER_EXPIRY_DATE) END >= CONVERT(DATE,GETDATE());
然而,这不是 sargable 即不能使用任何索引,MEMBER_EXPIRY_DATE
所以我建议将逻辑切换到
UPDATE SPECIAL_MEMBER SET
SAVINGS_PERCENT = 10
, ORDER_COUNT = 1
WHERE SPECIAL_MEMBER = '4382'
AND MEMBER_EXPIRY_DATE >= CONVERT(DATE,DATEADD(DAY,CASE WHEN CANCELLED = 0 THEN -15 ELSE 0 END,GETDATE()))
笔记:
- 日期不会自然添加,请使用该
dateadd
功能。 - 这没有什么动态的 - 动态 SQL 是完全不同的东西
- 使用良好的布局和一致的大小写对读取 SQL 有很大的影响
推荐阅读
- c++ - 对复制构造函数已被删除的对象向量进行迭代 (C2280)
- excel - 读取多个 CSV 文件并将每个文件内容写入 Excel 电子表格中的单独工作表
- java - 如何在 Android 电视中保持屏幕开启
- java - Spring Boot 条件属性评估
- python - 在网络爬虫中返回 302
- ruby-on-rails - PG 错误:尝试销毁时整数的输入语法无效
- android - 在框架中调用自创静态方法时出现NoSuchMethodError
- javascript - 部署到 Github Pages 时,React 应用静态资产超出了 GitHub 文件大小限制
- excel - 使用 excel vba 复制特定数据
- mysql - 有什么方法可以显示 MySQL 表锁定历史