1

我正在尝试根据条件从 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

编辑/更新:

更多的代码涉及 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,我希望它只显示前 5 行。但是,如果我们处于 6、7、8、9 及以后的任何其他时期,则显示所有表格行。当前期间保存在变量@PRD 中,该变量是通过将今天的日期与表中保存的范围进行比较而得出的。该值是准确的,并且还键入 INT

希望这可以帮助

SQL 小提琴

4

2 回答 2

5

这将起作用:

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

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

于 2013-11-01T10:39:09.117 回答
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 ...
于 2013-11-01T10:20:12.230 回答