2013-04-23 65 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