【问题标题】:CASE in WHERE clause using IN command使用 IN 命令的 WHERE 子句中的 CASE
【发布时间】:2014-04-28 04:02:18
【问题描述】:

我需要像这样执行我的语句:

Select myColumn
From myTable
WHERE
CASE 
WHEN Datepart(y,@year_end) = 2010 and Datepart(m,@year_end) = 3 then CalendarQuarter in (@Q1,@Q2,@Q3,@Q4) 
WHEN Datepart(y,@year_end) = 2010 and Datepart(m,@year_end) = 6 then CalendarQuarter in (@Q2,@Q3,@Q4)
WHEN Datepart(y,@year_end) = 2010 and Datepart(m,@year_end) = 9 then CalendarQuarter in (@Q3,@Q4)  
END

我无法正确使用语法。基本上,当我提供 2010 年和第 3 个月时,我希望使用第一个 IN 语句。如果我说月份 = 6,那么我想使用第二个 IN 语句。

【问题讨论】:

  • 对于year,语法为datepart(yy, date)datepart(y,date) 将返回dayofyear

标签: sql sql-server tsql case where


【解决方案1】:

布尔表达式在 SQL 中在语法上是有区别的;它们不仅仅是计算为布尔值的正常表达式。所以你不能在CASE 表达式中使用THEN ... IN ... 作为THEN 子句(因为该子句需要一个普通表达式,而不是布尔表达式),你不能将WHERE CASE ... 用作WHERE子句(因为该子句需要一个布尔表达式,CASE ... 不是)。

有多种方法可以解决此问题。在你的情况下,你可能会这样写:

Select myColumn
From myTable
WHERE Datepart(yy,@year_end) = 2010
  AND CalendarQuarter IN
      ( (CASE WHEN Datepart(m,@year_end) = 3 THEN @Q1 END),
        (CASE WHEN Datepart(m,@year_end) IN (3,6) THEN @Q2 END),
        @Q3, @Q4
      )
;

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多