T-SQL中WHERE子句使用CASE表达式报错:Incorrect syntax near '<'
T-SQL中CASE表达式在WHERE子句的语法错误解决方法
你遇到的报错是因为T-SQL的CASE表达式不支持直接返回布尔判断结果,它只能返回数值、字符串这类标量值。你原来的写法里,CASE的THEN/ELSE分支直接写了DATEDIFF(...) <= 31这种比较语句,不符合语法规则,所以触发了"Incorrect syntax near '<'"错误。
针对你的需求(根据OnDate所在月份的天数,判断OnDate与OffDate的天数差是否≤对应阈值),可以用以下两种正确写法:
写法一:用CASE返回允许的最大天数阈值
调整CASE的作用,让它返回对应月份的最大允许天数,再和实际天数差做比较:
SELECT * FROM TableName CA -- 这里加上表别名CA,对应原代码里的CA.OnDate,若不需要可去掉 WHERE CStatus = 'Active' AND ServiceStatus = 'Active' AND DATEDIFF(day, CA.OnDate, CA.OffDate) > 0 AND DATEDIFF(day, CA.OnDate, CA.OffDate) <= CASE WHEN DAY(EOMONTH(CA.OnDate)) = 31 THEN 31 ELSE 30 END
写法二:用逻辑表达式替代CASE
直接用OR/AND组合逻辑分支,可读性更强:
SELECT * FROM TableName CA WHERE CStatus = 'Active' AND ServiceStatus = 'Active' AND DATEDIFF(day, CA.OnDate, CA.OffDate) > 0 AND ( (DAY(EOMONTH(CA.OnDate)) = 31 AND DATEDIFF(day, CA.OnDate, CA.OffDate) <= 31) OR (DAY(EOMONTH(CA.OnDate)) <> 31 AND DATEDIFF(day, CA.OnDate, CA.OffDate) <= 30) )
注意:原代码里的CA.OnDate如果是表别名,记得在FROM子句里给TableName加上别名CA,否则会报错找不到CA对象。
内容的提问来源于stack exchange,提问作者Bilal Shah
相关产品推荐
相关产品推荐

