【发布时间】:2013-11-12 12:42:44
【问题描述】:
我正在尝试根据条件从 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
希望对你有帮助
【问题讨论】:
-
CASE是一个返回单个值(每行)的表达式。您不能显示更多当前代码 - 生成您正在显示的错误消息吗? -
有多少个“周期”,它们与日历年有何关系?您的逻辑似乎很奇怪:“我们处于第 2 阶段,所以我希望从我的 CTE 返回的所有内容都在 PRD 1 和 5 之间”!?但我想如果这就是你所需要的......
-
嗨达米安。那是整个生成错误的代码。它在 cte 的末尾...将更新以显示此
-
嗨托尼。我唯一遇到的问题是显示行的位。不是我的 CTE 或我的@PRD 是如何派生的。我的逻辑很好。这是部门的要求,我只需要这样做,不要质疑它哈哈但是谢谢你指出。
-
@Chen - 很公平,如果这是他们想要的,但质疑要求总是好的 :)
标签: sql-server-2008 tsql select conditional-statements