在SQL Server中,where子句中的case语句

18

我正在尝试在SQL查询的where子句中添加一个case或if语句。
我有一个包含起始日期和结束日期以及每天表示旅程发生地点的布尔字段的旅行时间表。这是我目前的代码,但是我得到了错误的语法错误:

declare @date datetime
set @Date = '05/04/2012' 
declare @day nvarchar(50)
set @day = 'Monday'

Select * From Times
WHERE (StartDate <= @Date) AND (EndDate >= @Date)
CASE WHEN @day = 'Monday' THEN
 AND (Monday = 1)
WHEN @day = 'Tuesday' THEN
AND (Tuesday = 1)
ELSE
AND (Wednesday = 1) 
END 

2
看起来你的表格设计有问题,你不应该有星期一、星期二、星期三等列。你应该有一个日期列,并将其填充为所需的日期或数字值,该数字值是您想要查找的日期。如果适用于多个日期,则使用相关表格。 - HLGEM
3个回答

47

where语句中不需要使用case,只需使用括号和or即可:

Select * From Times
WHERE StartDate <= @Date AND EndDate >= @Date
AND (
    (@day = 'Monday' AND Monday = 1)
    OR (@day = 'Tuesday' AND Tuesday = 1)
    OR Wednesday = 1
)

此外,你的语法在 case 语句中是错误的。它不会将内容添加到字符串中,而是返回单个值。如果实际上要使用 case 语句(但你不应该这样做),你需要像这样编写:

Select * From Times
WHERE (StartDate <= @Date) AND (EndDate >= @Date)
AND 1 = CASE WHEN @day = 'Monday' THEN Monday
             WHEN @day = 'Tuesday' THEN Tuesday
             ELSE Wednesday
        END 

而且为了让它更有力量,您可以使用 between 运算符来处理日期:

where @Date between StartDate and EndDate
制作您的最终查询:
select
    * 
from 
    Times
where
    @Date between StartDate and EndDate
    and (
        (@day = 'Monday' and Monday = 1)
        or (@day = 'Tuesday' and Tuesday = 1)
        or Wednesday = 1
    )

谢谢Eric - 非常完美 :) - e-on
@Eric 这会减慢查询速度。 - Error No.2793985

5

只需执行 select 操作:

Select * From Times
WHERE (StartDate <= @Date) AND (EndDate >= @Date) AND
((@day = 'Monday' AND (Monday = 1))
OR (@day = 'Tuesday' AND (Tuesday = 1))
OR (Wednesday = 1))

1
我不好意思给你点踩,但是你可以在where子句中使用case。只是你不能像OP试图做的那样使用它。 - Eric
1
在Microsoft SQL Server中,您确实可以在WHERE子句中使用CASE。尝试这个 - 在SQL 2008 R2上解析和执行都很好: "select * from sys.tables t where case when t.schema_id = 1 then 1 else 0 end = 1" - jklemmack

1

CASE语句是一个表达式,就像布尔比较一样。这意味着'AND'需要放在'CASE'语句之前,而不是在其中。

Select * From Times
WHERE (StartDate <= @Date) AND (EndDate >= @Date)

AND -- Added the "AND" here

CASE WHEN @day = 'Monday' THEN (Monday = 1)   -- Removed "AND" 
    WHEN @day = 'Tuesday' THEN (Tuesday = 1)  -- Removed "AND" 
    ELSE AND (Wednesday = 1) 
END

谢谢你的编辑,Dylan。今天早上我一定是在使用VB。 - jklemmack
2
你好 jklemmack,我最初尝试了这个,但是在 case 语句的顶部行中收到了一个“Incorrect syntax near '='”错误。当我执行这个查询时仍然会出现这个错误。 - e-on

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接