You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行时确定WHERE子句,不使用动态SQL能否通过CASE实现?

错误原因

SQL 中的 CASE 属于标量表达式,仅能返回具体的数值、字符串、日期等标量值,不能直接返回逻辑判断条件,你此前将比较逻辑写在 THEN 分支后的写法不符合 SQL 语法规范,因此触发语法报错。
另外你最初写的周一查询条件逻辑有误,用 OR 会匹配所有早于前一天的历史订单,实际筛选上周区间应该用 AND 连接上下限条件。

非动态SQL实现方案

不需要调用 EXEC 执行动态SQL,直接通过逻辑运算符组合互斥的判断分支即可实现需求,正确写法如下:

SELECT * FROM Orders
WHERE
-- 周一:取上周一到上周日(近7天到前1天)的订单
(DATEPART(dw, GETDATE()) = 2 
 AND Order_Date >= DATEADD(dd, -7, GETDATE()) 
 AND Order_Date <= DATEADD(dd, -1, GETDATE()))
OR
-- 非周一:仅取前一天的订单
(DATEPART(dw, GETDATE()) != 2 
 AND Order_Date = DATEADD(dd, -1, GETDATE()))
补充说明
  • 注意不同数据库环境的 DATEPART(dw, date) 返回值可能受周起始设置影响,部分环境中周一对应的返回值为1而非2,可以先执行 SELECT DATEPART(dw, GETDATE()) 确认当前环境的周内日期返回值后再调整判断条件。
  • 两个判断分支互斥,数据库执行时只会匹配符合当前日期的分支逻辑,不会额外扫描无关数据,性能和分开写两个查询没有差异。

内容的提问来源于stack exchange,提问作者Area51Resident

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:21:04