在WHERE子句中使用复杂CASE的T SQL SELECT语句

时间:2014-04-18 16:10:06

标签: sql-server sql-server-2008 tsql

我试图从表格中选择*,但选择范围取决于输入的月份。

我在WHERE子句中使用CASE来确定月值,并选择正确的Where语句。

我得到一个错误,“关键字'AND'附近的语法不正确。”

这是我的SQL语句

  

从MyTable中选择*

     

其中Station ='MyStation'

     

以及@Month>的情况9然后

     

(CONVERT(DATE,CommittedDate,103)BETWEEN

     
    

CAST(@Year as varchar(10))+'1001'AND CAST(@Year as varchar(10))+ REPLACE(STR(@Month,2),'','0')+'25' )

  
     

否则

     
    

(CONVERT(DATE,CommittedDate,103)BETWEEN

         

CAST(@Year as varchar(10))+'1001'AND CAST(@Year as varchar(10))+ REPLACE(STR(@Month,2),'','0')+'25' )

  

我已尝试在BETWEEN之后添加CASE,仅过滤两者之间的值,但这也不起作用。

感谢任何帮助:)

2 个答案:

答案 0 :(得分:2)

这里你真的不需要一个案例陈述。你应该能够这样做:

select * from MyTable
where Station = 'MyStation'
and ((@Month > 9 AND
        (CONVERT(DATE, CommittedDate, 103) BETWEEN
            CAST(@Year as varchar(10))+ '1001' AND CAST(@Year as varchar(10))+ REPLACE(STR(@Month, 2), ' ', '0')+'25'))
    OR (@Month <= 9
            (CONVERT(DATE, CommittedDate, 103) BETWEEN
               CAST(@Year as varchar(10))+ '1001' AND CAST(@Year as varchar(10))+ REPLACE(STR(@Month, 2), ' ', '0')+'25')))

答案 1 :(得分:1)

在您的特定示例中,您不需要(并且不应该)将其放在WHERE开头。它可以在查询之前计算并存储到变量中。