【问题标题】:SQL Case statement /where clause issuesSQL Case 语句/where 子句问题
【发布时间】:2015-11-23 21:03:46
【问题描述】:

我正在尝试通过在上面的 case 语句中使用声明的变量来动态修改我的 where 子句。如果我缺少一个简单的答案,请原谅我,但我完全是自学的,还有很多东西要学。这是语法示例。我不会打扰语句的整个语法,希望你能理解我想要做什么。

declare @myvar1 double
declare @myvar2 double

SELECT
q1.host_po_nbr,
q1.etd,
CASE
    WHEN WEEKDAY(TODAY) = 1 Then 11
    WHEN WEEKDAY(TODAY) = 2 Then 12
    WHEN WEEKDAY(TODAY) = 3 Then 13
    WHEN WEEKDAY(TODAY) = 4 Then 14
    WHEN WEEKDAY(TODAY) = 5 Then 15
END @myvar1,
CASE
    WHEN WEEKDAY(TODAY) = 1 Then 5
    WHEN WEEKDAY(TODAY) = 2 Then 6
    WHEN WEEKDAY(TODAY) = 3 Then 7
    WHEN WEEKDAY(TODAY) = 4 Then 8
    WHEN WEEKDAY(TODAY) = 5 Then 9
END @myvar2,
FROM q1
WHERE q1.etd BETWEEN today - @myvar1 AND today - @myvar2

【问题讨论】:

  • 不清楚你想在这里做什么..
  • case 语句毫无意义,只有第一个 =1 有效。其次,你不能使用这样的变量,你可以通过子查询轻松解决这个问题
  • 也许您正在尝试设置 @myvar1@myvar2 的值,但您需要在选择查询之前这样做.. Set @myvar1 = CASESet @myvar2 = CASE 然后 Select where q1.etd BETWEEN today - @myvar1 AND today - @myvar2跨度>
  • 我在这里与@JamieD77 在一起,在包含您当前的 sn-p 之前,请尝试用文字表达您想要做的事情。当您遇到问题时,sn-p 通常是错误的,因此很难从中推断出含义。
  • 我很抱歉。我全神贯注于把它放在那里,以至于我匆忙打错了。我将尝试按照您在评论中的建议进行解释。到目前为止,我感谢每个人对此的快速反应。谢谢你们。基本上我有一个查询,每天早上都会通过调度系统运行。指定我的 between 语句中的天数的 Where 条件将需要根据运行查询的日期进行调整。如果它在星期一(第 1 天)运行,那么它需要介于 -11 和 -5 之间。如果它在星期二(第 2 天)运行,那么它需要介于 -12 和 -6 之间,依此类推。

标签: sql sql-server tsql case


【解决方案1】:

我假设您只使用变量来尝试从您的WHERE 子句引用SELECT 子句中的计算。您不能在 WHERE 子句中引用来自 SELECT 的别名(至少在大多数 SQL 系统中不会)。原因是WHERE 子句在选择之前 被评估,因此在评估WHERE 子句时这些别名不存在。但是,您可以使用子查询:

SELECT * FFROM
   (SELECT
    q1.host_po_nbr,
    q1.etd,
    CASE
    WHEN WEEKDAY(TODAY) = 1 Then 11
    WHEN WEEKDAY(TODAY) = 1 Then 12
    WHEN WEEKDAY(TODAY) = 1 Then 13
    WHEN WEEKDAY(TODAY) = 1 Then 14
    WHEN WEEKDAY(TODAY) = 1 Then 15
    END myvar1,
    CASE
    WHEN WEEKDAY(TODAY) = 1 Then 5
    WHEN WEEKDAY(TODAY) = 1 Then 6
    WHEN WEEKDAY(TODAY) = 1 Then 7
    WHEN WEEKDAY(TODAY) = 1 Then 8
    WHEN WEEKDAY(TODAY) = 1 Then 9
    END myvar2,
    FROM q1
    ) q
    WHERE etd BETWEEN today - myvar1 AND today - myvar2

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT
    
    q1.host_po_nbr,
    q1.etd,
    CASE
    WHEN WEEKDAY(TODAY) = 1 Then 11
    WHEN WEEKDAY(TODAY) = 1 Then 12
    WHEN WEEKDAY(TODAY) = 1 Then 13
    WHEN WEEKDAY(TODAY) = 1 Then 14
    WHEN WEEKDAY(TODAY) = 1 Then 15
    END myvar1,
    CASE
    WHEN WEEKDAY(TODAY) = 1 Then 5
    WHEN WEEKDAY(TODAY) = 1 Then 6
    WHEN WEEKDAY(TODAY) = 1 Then 7
    WHEN WEEKDAY(TODAY) = 1 Then 8
    WHEN WEEKDAY(TODAY) = 1 Then 9
    END myvar2,
    
    FROM q1
    HAVING q1.etd BETWEEN today - myvar1 AND today - myvar2
    

    但是,这可能效率低下。如果这不能解决您的问题,请发布更多详细信息,特别是您的表结构 (SHOW CREATE TABLE) 以及您想要实现的目标的详细描述。

    【讨论】:

    • 大多数 SQL 系统不允许您从 WHERE 子句引用 SELECT 别名。 SQL Server 就是其中之一。
    • 出于某种原因,我认为这被标记为 MySQL - MySQL 允许该语法。
    • 在 5.5 为我工作:mysql> create table t1 (n int); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values (1),(2); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select n + 1 as foo,n from t1 having foo = 3; +------+------+ | foo | n | +------+------+ | 3 | 2 | +------+------+ 1 row in set (0.00 sec)
    • 文档还限制了 WHERE 但没有 HAVING。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多