我正在尝试根据条件从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
希望这有帮助
答案 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 ...