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类型
希望这可以帮助
这将有效:
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,然后我们检查该句点是否为列表.