【问题标题】:T SQL SELECT statement with complex CASE in WHERE clauseWHERE 子句中具有复杂 CASE 的 T SQL SELECT 语句
【发布时间】:2014-04-18 16:10:06
【问题描述】:

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

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

但是我得到一个错误;

关键字“AND”附近的语法不正确。

这是我的 SQL 语句:

select * from MyTable
where Station = 'MyStation' 
and  case when @Month > 9 then

(CONVERT(DATE, CommittedDate, 103) BETWEEN 

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

else

(CONVERT(DATE, CommittedDate, 103) BETWEEN 

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

我尝试将CASE 放在BETWEEN 之后,只过滤两者之间的值,但这也不起作用。

【问题讨论】:

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


    【解决方案1】:

    您实际上并不需要这里的案例陈述。你应该可以这样做:

    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')))
    

    【讨论】:

    • 不应该说谢谢,但效果很好,我很感激。我喜欢这个解决方案:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多