TSQL SELECT基于条件

Uch*_*lah 1 t-sql select sql-server-2008 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 
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式.

请问我怎么能这样做?

谢谢x

编辑/更新:

更多的代码涉及CTE并且非常长.底线是让我说我​​有这个CTE

;WITH DISPLAY as (
     select * from lots_of_things
)
SELECT * FROM DISPLAY
Run Code Online (Sandbox Code Playgroud)

在此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
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助

SQL FIDDLE

Fed*_*jdu 5

这将有效:

SELECT * FROM DISPLAY WHERE (@PRD > 5 OR PERIOD IN (1, 2, 3, 4, 5))
Run Code Online (Sandbox Code Playgroud)

如果这段代码让你感到困惑,那么我们检查的是@PRD> 5,如果返回true,我们的表达式总是为true,所以我们返回所有的行.如果变量小于或等于5(就像您在示例中检查过的那样),则第一次检查为false,然后我们检查该句点是否为列表.