2013-11-01 80 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链接? –