Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server WHERE子句中的CASE语句_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

SQL Server WHERE子句中的CASE语句

SQL Server WHERE子句中的CASE语句,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我在整理这件事上有困难。我想看看你收到的日期的财政季度。当@ReviewPeriodQuarter=1时,我希望您收到的日期为10、11、12个月。如果@ReviewPeriodQuarter=2,则我需要您收到的日期、月份1、2、3等。SQL Server不喜欢这部分的中间部分。谢谢 DECLARE @ReviewPeriodQuarter Int SELECT * FROM Table WHERE MONTH(Date_Received) = CASE

我在整理这件事上有困难。我想看看你收到的日期的财政季度。当@ReviewPeriodQuarter=1时,我希望您收到的日期为10、11、12个月。如果@ReviewPeriodQuarter=2,则我需要您收到的日期、月份1、2、3等。SQL Server不喜欢这部分的中间部分。谢谢

DECLARE @ReviewPeriodQuarter Int

SELECT * FROM Table
WHERE
        MONTH(Date_Received) =
        CASE 
            WHEN @ReviewPeriodQuarter = 1 THEN BETWEEN 10 AND 12 
            WHEN @ReviewPeriodQuarter = 2 THEN BETWEEN 1 AND 3 
            WHEN @ReviewPeriodQuarter = 3 THEN BETWEEN 4 AND 6 
            WHEN @ReviewPeriodQuarter = 4 THEN BETWEEN 7 AND 9 
        END 

我通常会将范围移动到
选择的范围之外,然后只使用一个简单的
,其中

DECLARE@MonthStart int,
@蒙特亨德国际酒店;
选择@MonthStart=CASE@ReviewPeriodQuarter,当1时,然后选择10,
当2是1时
当3到4
当4到7
完,,
@MonthEnd=案例@ReviewPeriodQuarter当1时,则为12,
2时3分
当3到6
4点到9点
结束;
挑选*
来自dbo。[表]
其中,@MonthStart和@MonthEnd之间的月份(收到日期);

请注意,由于在
的WHERE
中使用了
月(收到日期)
,因此这仍然是不可取的。我必须承认,不管年份如何,在特定月份需要表中的行有点奇怪。如果这是您真正的需求,那么您最好“投资”一个日历表,您可以
加入
,然后在日历表的
日历月
列上有一个
WHERE
;这将是可搜索的。

您可以使用更多参数,如Larnu,或者使用原始方法,但进行了调整

DECLARE@ReviewPeriodQuarter INT
挑选*
从桌子上
其中月份(收到日期)介于
案例
当@ReviewPeriodQuarter=1时,则为10
当@ReviewPeriodQuarter=2时,则为1
当@ReviewPeriodQuarter=3时,则为4
当@ReviewPeriodQuarter=4时,则为7
结束
及
案例
当@ReviewPeriodQuarter=1时,则为12
当@ReviewPeriodQuarter=2时,则为3
当@ReviewPeriodQuarter=3时,则为6
当@ReviewPeriodQuarter=4时,则为9
结束

如何使用
值()

或者更简单地说:

WHERE DATEPART(quarter, DATEADD(MONTH, -3, t.Date_Received)) = @ReviewPeriodQuarter

换句话说,您不需要条件逻辑来指定每个季度。您可以使用日期算术。

这是一个
大小写
表达式,而不是
大小写
开关
)语句;它返回一个标量值,而不是布尔结果(在本例中为1的一半)。但是,不要在
WHERE
中使用
大小写
表达式,坚持使用
运算符。可爱的语法,但不是。
大小写
表达式不会产生布尔值,无法进行比较。你必须写
(@ReviewPeriodQuarter=1和月(Date_Received)在10和12之间)或(@ReviewPeriodQuarter=2和月(Date_Received)在1和3之间)…
A用于创意,F用于执行?有很多很酷的方法可以解决这个问题。谢谢你的帮助
WHERE DATEPART(quarter, DATEADD(MONTH, -3, t.Date_Received)) = @ReviewPeriodQuarter