CASE / IF声明根据参数值声明变量

时间:2014-05-20 16:33:27

标签: sql if-statement parameters case

一直在研究' CASE'语法和我认为我接近得到我需要的东西,但有些东西是关闭的。 SSMS并不喜欢我用CASE写我的查询的方式,我最后让自己感到困惑,所以我把下面的样本写成了一个' IF'声明,我可以表达我想要实现的目标。任何提示或提示肯定会受到赞赏。

目标是有一个日期范围的参数列表("上周","月到日"等),当选中时将传递两个值(上下日期)限制)到WHERE语句。

DECLARE @Param1 VARCHAR(20)
-- Param1 will be set when the user selects a string value, e.g. "Last Month"

DECLARE @Date1 DATE, @Date2 DATE
-- Date1 & Date2 will be the respective lower and upper date boundaries used in the WHERE statement.

IF @Param1 = 'Last Month'
THEN
SET @Date1 = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,DATEADD(mm,-1,GETDATE())))
SET @Date2 = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))

ELSE IF @Param1 = 'Current Month'
THEN
SET @Date1 = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
SET @Date2 = CONVERT(DATE,GETDATE())

ELSE
-- Default to yesterday if nothing selected by user
SET @Date1 = CONVERT(DATE,GETDATE()-1)
SET @Date2 = CONVERT(DATE,GETDATE())

END IF

1 个答案:

答案 0 :(得分:2)

您可以使用两个case语句执行此操作:

select @Date1 = (case when @Param1 = 'Last Month'
                      then CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,DATEADD(mm,-1,GETDATE())))
                      when @Param1 = 'Current Month'
                      then CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
                      else CONVERT(DATE,GETDATE()-1)
                  end);

select @Date2 = (case when @Param1 = 'Last Month'
                      then CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
                      when @Param1 = 'Current Month'
                      then CONVERT(DATE,GETDATE())
                      else CONVERT(DATE,GETDATE())
                  end);