在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
相关产品推荐
相关产品推荐

