SQL - 具有多个的Case语句

时间:2013-04-23 14:50:50

标签: sql sql-server-2008 tsql

我正在使用T-SQL,我试图让then语句返回多个值,这样我就可以在'Year'列中搜索多年。

如果年份大于2013年,那么我想搜索当前年份和上一年度。因此,如果今年是2016年,我想搜索2016年和2015年。

此代码不起作用,但这正是我想要完成的。

SELECT *
FROM [DB_NAME].[dbo].[TABLE_NAME] 
WHERE 
YR_CLMN in 
(
case when YEAR(GETDATE()) = 2013 then YEAR(GETDATE()) 
when YEAR(GETDATE()) > 2013 then (YEAR(GETDATE()), YEAR(GETDATE())-1)
end
)

提前致谢!!!

4 个答案:

答案 0 :(得分:3)

我不是百分百肯定我理解这个问题,但我相信它会给你你想要的东西

SELECT *
FROM [DB_NAME].[dbo].[TABLE_NAME] 
WHERE 
YR_CLMN >= 
(
case when YEAR(GETDATE()) > 2013 then YEAR(GETDATE())-1) 
ELSE YEAR(GETDATE())
end
) AND YR_CLMN <= YEAR(GETDATE())

这是

SQLFiddle

答案 1 :(得分:1)

尝试:

SELECT * FROM [DB_NAME].[dbo].[TABLE_NAME] 
WHERE YR_CLMN in 
(YEAR(GETDATE()), 
 case when YEAR(GETDATE()) > 2013 then YEAR(GETDATE())-1 else YEAR(GETDATE()) end)

答案 2 :(得分:0)

DECLARE @Dates Table
(
  YR_CLMN DateTime
  BringOut bit DEFAULT ( 0 )
)

--Get all columns
INSERT INTO @Dates ( YR_CLMN )
SELECT YR_CLMN
FROM [dbo].[YourTable]

--Where YR_CLMN = 2013
UPDATE @Dates SET BringOut = 1
WHERE YEAR(YR_CLMN) = 2013

--Where YR_CLMN is within a year of now
UPDATE @Dates SET BringOut = 1
WHERE YEAR(YR_CLMN) = YEAR(GETDATE()) OR YEAR(YR_CLMN) = YEAR(GETDATE()) - 1

SELECT YR_CLMN
FROM @Dates
WHERE BringOut = 1

或者,如果上述方法不可接受。你基本上是在说YR_CLMN = 2013 OR (YR_CLMN = YEAR(GETDATE()) AND YR_CLMN = YEAR(GETDATE()) - 1)IN使用{{1}}在性能方面确实不是很有效率。

答案 3 :(得分:0)

到目前为止,有很多好的建议,所以我会采取稍微不同的做法。

假设您已获得numbers table的访问权限。如果没有,去买一个! :)我们还假设它名为Numbers,列Number

另外,为了便于阅读,我们使用CTE。这使得查询非常简洁。

; WITH ValidYears AS
(
    SELECT Number AS ValidYear
    FROM [dbo].[Numbers]
    WHERE Number >=  2013
        AND Number >= YEAR(GETDATE()) - 1
        AND NUmber <= YEAR(GETDATE())
)
SELECT *
FROM [DBName].[dbo].[TABLE_NAME] a
JOIN ValidYears b
    ON a.YR_CLMN = b.ValidYear

我喜欢这个是你将查询分成逻辑单元。 CTE处理年份逻辑,以下查询决定如何处理它。

当然,你不必使用数字表;我认为它看起来更好。

这是我本地数字表的示例,以及CTE结果的样子。如果您已正确编入索引,则会有一个聚簇索引搜索 - 非常有效。 (旁注:我的表名为&#34;整数&#34;)

DECLARE @CurrentYear INT
SET @CurrentYear = 2016

SELECT value AS ValidYear
FROM [dbo].Integers
WHERE value >=  2013
    AND value >= @CurrentYear - 1
    AND value <= @CurrentYear