2013-04-23 67 views
1

我正在使用T-SQL,我试图让一个then语句返回多个值,因此我可以搜索多年的'Year'列。SQL - 多个案例陈述

如果年份大于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 
) 

在此先感谢!

+0

Ew不要用在可能的地方!虽然这是一个选择语句,看起来更加整洁,但最好将其分解为大块大小:) – LukeHennerley 2013-04-23 14:52:46

+0

您真的期望Year(GetDate())返回2013还是更少? – sgmoore 2013-04-23 16:15:47

回答

3

我不是100%肯定我明白了这个问题,但我相信它会给你想要的东西

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

+0

检查SQL小提琴Alex – 2013-04-23 15:55:47

+0

@SHAKIR SHABBIR:Checked;我相信它按预期工作(至少我理解需求 - 如果当前年度大于2013年,即2014,2015年......,然后将年份之间的记录返回到之前与当前年份之间;如果当前年份为2013年并且少于仅返回当年的数据)。我可能误解了需要的东西,尽管... – a1ex07 2013-04-23 16:20:32

+0

我也相信这个要求就是你的要求。 – 2013-04-23 16:27:09

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在性能方面确实不是非常高效。

+0

@Downvoter的原因是什么? – LukeHennerley 2013-04-23 15:03:54

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) 
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结果的外观。如果你的索引正确,将会有一个聚集索引查找 - 非常有效。 (旁注:我的桌子被命名为“整数”)

DECLARE @CurrentYear INT 
SET @CurrentYear = 2016 

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