where 子句中的 case 语句 - SQL Server

Posted

技术标签:

【中文标题】where 子句中的 case 语句 - SQL Server【英文标题】:case statement in where clause - SQL Server 【发布时间】:2012-01-04 17:11:31 【问题描述】:

我正在尝试在我的 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 

【问题讨论】:

在我看来,好像你的桌面上有设计问题,你不可能在星期一、星期二、星期三等有列。你应该有一个 daya 列并用你的那一天填充它want 或一个数值,用于查找您想要的日期。如果超过一天适用,则使用相关表格。 【参考方案1】:

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 语句(您不应该这样做),您会想要这样的东西:

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 这会减慢查询速度【参考方案2】:

只需执行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))

【讨论】:

对你投反对票对我来说是不礼貌的,但你可以在where 子句中使用case。你只是不能像 OP 试图做的那样使用它。 在 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”【参考方案3】:

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,我最初尝试过这个,在 case 语句的第一行出现“'=' 附近的语法错误”错误。当我执行这个查询时仍然得到这个

以上是关于where 子句中的 case 语句 - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

具有另一个 sql 语句的 where 子句中的 case 条件

在 where 子句 SQL 中的 case 语句中使用参数

sql server 2008 r2:当前会计年度 where 子句中的 case 语句

SQL 在 WHERE IN 子句中使用 CASE 语句

Oracle SQL的Where子句中如何写case语句?

如何在 SQL Server 的 Where 子句中使用 case 语句