WHERE 子句中的 SQL CASE 语句

SQL CASE statement in the WHERE clause

提问人:Elizabeth 提问时间:7/6/2023 更新时间:7/6/2023 访问量:32

问:

我有一个用户的报告,数据集有 3 个可以评估的可能日期。(尽管这可以增长到我们系统中的 5 个)。
对于这三个日期中的每一个,他们都可以选择范围的开始日期和结束日期。

我想做的是说,如果用户选择 date1,则在开始日期和结束日期之间将查询评估为 date1。如果用户选择 date2,则在开始日期和结束日期之间计算 date2


@review_dt = value they pick - start_dt, expiration_dt, etc. 

select * from <TABLE>
where fyear = @fyear 
and CASE    WHEN @review_dt = 'start_dt' THEN start_dt between @date_start and @date_end
            WHEN @review_dt = 'expiration_dt' THEN expiration_dt between @date_start and @date_end
            WHEN @review_dt = 'perf_dt' THEN perf_dt between @date_start and @date_end

如果这不是我可以像这样做的事情 - 什么是一个好的、干净的简单方法可以做到这一点,而不需要一系列嵌套的 if 语句。

sql-server if-statement sql-server-2012 嵌套 案例

评论

1赞 Stu 7/6/2023
这不是你使用大小写表达式的方式。有 3 个单独的查询/过程和一个包装过程来调用它们,或者动态构建查询以使用所需的列并通过以下方式传递日期参数sp_executesql

答:

0赞 GMB 7/6/2023 #1

表达式生成标量值,而您要计算条件。您可以改用布尔逻辑:case

select * 
from mytable
where 
    fyear = @fyear 
    and (
           (@review_dt = 'start_dt'      and start_dt      between @date_start and @date_end)
        or (@review_dt = 'expiration_dt' and expiration_dt between @date_start and @date_end)
        or (@review_dt = 'perf_dt'       and perf_dt       between @date_start and @date_end)
     )
option (recompile)