2013-11-01 118 views
1

我想根據條件從CTE中進行選擇。基於條件的TSQL SELECT

我今天宣佈了一個變量(@PRD)。它持有我們目前處於什麼階段的價值。

現在我想從表中選擇一個表,根據我們是否在上半年限制返回什麼信息。例如,我們處於期間2,所以我希望從我的CTE返回的一切都落在PRD 1和5之間。如果我們說的是期間6(5後),那麼是的,我希望所有從表。

這是我想要實現的僞代碼:

SELECT 
    CASE 
     WHEN @PRD <= 5 
     THEN (SELECT * FROM DISPLAY WHERE PERIOD IN (1,2,3,4,5)) 
     ELSE (SELECT * FROM DISPLAY) 
    END 

我得到一個錯誤:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

請我如何能做到這一點有什麼想法?

感謝X

編輯/更新:

更多的代碼涉及CTE,是很長的。底線是,可以說我有這個CTE

;WITH DISPLAY as (
    select * from lots_of_things 
) 
SELECT * FROM DISPLAY 

做完這個CTE常規選擇,它返回一個看起來像這樣的數據:

PERIOD (INT) DEPARTMENT GROUP BUDGET 
1    ENERGY  HE  500 
2    ENERGY  HE  780 
3    ENERGY  HE  1500 
4    ENERGY  HE  4500 
5    ENERGY  HE  400 
6    ENERGY  HE  3500 
7    ENERGY  HE  940 
8    ENERGY  HE  1200 

我想讓它顯示我只是前5名如果我們當前的週期是1,2,3,4,5行。但是,如果我們處於像6,7,8,9以及其他任何時期那樣顯示ALL錶行。當前時間保存在變量@PRD中,該變量通過比較今天的日期和表中的範圍而得出。該值是準確的,也INT類型

希望這有助於

SQL FIDDLE

+1

'CASE'是*表達式*,它返回一個*單個*值(每行)。你能不能顯示更多你當前的代碼 - 這會產生你顯示的錯誤信息? –

+0

那裏有多少「時期」,它們與歷年有何關係?你的邏輯看起來很奇怪:「我們處於第二階段,所以我希望從我的CTE返回的一切都落在PRD 1和5之間!」!但我想如果這就是你需要的...... – Tony

+0

嗨達米安。那是完整產生錯誤的代碼。它是在一個cte的尾部...將更新以顯示此 –

回答

5

這將工作:

SELECT * FROM DISPLAY WHERE (@PRD > 5 OR PERIOD IN (1, 2, 3, 4, 5)) 

如果此代碼混淆你的,正在發生的事情是,我們是否@PRD> 5,如果返回true,我們的表現始終是真實的,所以我們全部歸還行。 如果變量小於或等於5(就像您在示例中檢查的那樣),第一個檢查是錯誤的,然後我們檢查該時間段是否爲列表。

+0

我不明白你的意思 –

+1

@Chen只需添加選擇...將更新答案。 –

+0

呃!一直盯着它幾個小時,最明顯的解決方案omg ...謝謝YOUUUUUUUUUUUUUUUUUUUUUUUUUUUUU xxxx –

1

這可能是一個解決辦法:

IF @PRD <= 5 
    SELECT * FROM DISPLAY WHERE PERIOD IN (1,2,3,4,5) 
ELSE 
    SELECT * FROM DISPLAY 

UPD

在這種情況下,你應該使用如果可能的話,而不是CTE。

DECLARE @PRD INT; 
SELECT @PRD = PERIOD FROM SOME_TABLE WHERE ... 
+0

關鍵字'IF'附近的語法錯誤。我在SQL 2008年BTW。而且這也是CTE(如果有任何方位的話)。 –

+0

@陳,http://sqlfiddle.com/#!3/7f824/1 - 應該工作。你能提供更多細節嗎? 「IF」之前的界限是什麼? – Smileek

+0

嗨Smileek。我沒有看到輸出:S這是正確的sqlfiddle鏈接? –