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

在WHERE子句中使用CASE结合BETWEEN的语法报错问题

解决WHERE子句中CASE语句的时段筛选语法问题

老兄,你这问题我太熟了——想用CASE在WHERE子句里根据@TimeType变量筛选不同时段的数据,但目前的写法犯了一个典型错误:CASE表达式是用来返回单个值的,你不能把整个BETWEEN条件直接当成CASE的返回结果,这就是为啥会报语法错误。

我给你两种靠谱的解决方案,选哪个看你习惯:

方案1:用OR组合条件(最直观)

这种写法直接把@TimeType的判断和对应时段的筛选绑定在一起,逻辑清晰,容易维护:

declare @TimeType int
select * 
from events 
where 
    (@TimeType = 0 and start_time between '00:00:00' and '11:59:00')
    OR (@TimeType = 1 and start_time between '12:00:00' and '16:59:00')
    OR (@TimeType = 2 and start_time between '17:00:00' and '23:59:00')

原理很简单:SQL会先判断@TimeType的值,然后只执行对应时段的BETWEEN检查,完全符合你的需求。

方案2:用CASE映射时段编号(更“优雅”的映射思路)

如果你更喜欢用CASE的方式,可以反过来,把每条数据的start_time转换成对应的时段编号(0/1/2),再和@TimeType匹配:

declare @TimeType int
select * 
from events 
where 
    CASE
        WHEN start_time between '00:00:00' and '11:59:00' THEN 0
        WHEN start_time between '12:00:00' and '16:59:00' THEN 1
        WHEN start_time between '17:00:00' and '23:59:00' THEN 2
    END = @TimeType

这种写法相当于给每个时间范围打个“标签”,然后用标签和变量匹配,逻辑上更统一,适合后续时段规则可能变化的场景。

两种方案都能完美解决你的语法错误问题,性能上在多数场景下差别不大,选你看着顺眼的就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:32:34