【问题标题】:TSQL SELECT based on a condition基于条件的 TSQL SELECT
【发布时间】: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

希望对你有帮助

SQL FIDDLE

【问题讨论】:

  • CASE 是一个返回单个值(每行)的表达式。您不能显示更多当前代码 - 生成您正在显示的错误消息吗?
  • 有多少个“周期”,它们与日历年有何关系?您的逻辑似乎很奇怪:“我们处于第 2 阶段,所以我希望从我的 CTE 返回的所有内容都在 PRD 1 和 5 之间”!?但我想如果这就是你所需要的......
  • 嗨达米安。那是整个生成错误的代码。它在 cte 的末尾...将更新以显示此
  • 嗨托尼。我唯一遇到的问题是显示行的位。不是我的 CTE 或我的@PRD 是如何派生的。我的逻辑很好。这是部门的要求,我只需要这样做,不要质疑它哈哈但是谢谢你指出。
  • @Chen - 很公平,如果这是他们想要的,但质疑要求总是好的 :)

标签: sql-server-2008 tsql select conditional-statements


【解决方案1】:

这将起作用:

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

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

【讨论】:

  • 我不明白你的意思
  • 呃!盯着它看了好几个小时,最明显的解决方案天哪...谢谢你UUUUUUUUUUUUUUUUUUUUUUUUUU xxxx
【解决方案2】:

这可能是一个解决方案:

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 ...

【讨论】:

  • 关键字“IF”附近的语法不正确。我在 SQL 2008 顺便说一句。这也遵循 CTE(如果有任何影响)。
  • @Chen, sqlfiddle.com/#!3/7f824/1 - 应该可以。你能提供更多细节吗? IF 之前的行是什么?
  • 嗨Smileek。我没有看到输出:S 那是正确的 sqlfiddle 链接吗?
  • @Chen,我没有放任何数据,所以它只是检查查询。如有必要,您可以在左侧窗格中添加一些 INSERTs。
  • @Chen,是的,我做到了,但是有变量,而不是 CTE。请检查更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2020-04-06
  • 2023-03-23
相关资源
最近更新 更多