TSQL SELECT基于条件

时间:2013-11-01 10:11:15

标签: sql-server-2008 tsql select conditional-statements

我正在尝试根据条件从CTE中进行选择。

我已经为今天的时期(@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 

我收到了一个错误:

  

当EXISTS没有引入子查询时,只能在选择列表中指定一个表达式。

请关注我怎么做?

谢谢x

EDITED /更新:

更多的代码涉及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

如果当前时期为1,2,3,4,5,我希望它只显示前五行。但是如果我们处于6,7,8,9及以后的任何其他时期,则显示所有表格行。当前期间保存在变量@PRD中,该变量来自于将今天的日期与表中保存的范围进行比较。值是准确的,也是INT

希望这有帮助

SQL FIDDLE

2 个答案:

答案 0 :(得分:5)

这将有效:

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

如果此代码让您感到困惑,那么我们检查的是@PRD&gt; 5如果返回true,则表达式始终为true,因此我们返回所有行。 如果变量小于或等于5(如您在示例中所检查的那样),则第一次检查为false,然后检查周期是否为列表。

答案 1 :(得分: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 ...