运行时确定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
相关产品推荐
相关产品推荐

