是否可以在SQL Server的where或having子句中使用自定义字段?

时间:2012-10-05 01:59:26

标签: sql sql-server sql-server-2008-r2

我正在尝试以下SQL查询:

  select (execution_end_timestamp - execution_queued_timestamp) as totalTime, execution_queued_timestamp from exec_queue
  where execution_name like '%Generate%'
  and execution_queued_timestamp > '2012-10-04 20:00:00.000'
  having totalTime < '1900-01-01 00:00:06.000'

我尝试在where和having子句中使用totalTime,在这两种情况下它都不起作用。我也尝试过希望可能有用的日期,但结果相同。

有没有一个技巧可以在where或having子句中使用计算字段?除了使用聚合函数的情况外,谷歌搜索没有发现任何东西。

2 个答案:

答案 0 :(得分:3)

不,WHERE子句不允许使用别名,请尝试

select (execution_end_timestamp - execution_queued_timestamp) as totalTime, execution_queued_timestamp 
from exec_queue
where execution_name like '%Generate%' AND
      execution_queued_timestamp > '2012-10-04 20:00:00.000' AND
      (execution_end_timestamp - execution_queued_timestamp) < '1900-01-01 00:00:06.000'

ALIASWHEREHAVING子句不起作用的原因

  • 首先形成from clause中所有表格的产品。
  • 然后评估where clause以消除不满足search_condition的行。
  • 接下来,使用group by clause
  • 中的列对行进行分组
  • 然后,消除了不满足having claus e中search_condition的组。
  • 接下来,评估select clause目标列表中的表达式。
  • 如果select子句中存在distinct keyword,则现在会删除重复的行。
  • 在评估每个子选择后,union被采用。
  • 最后,根据order by clause
  • 中指定的列对结果行进行排序

答案 1 :(得分:2)

我曾经有过指向SQL-92,99和2003 ISO标准的链接,但this link目前也会这样做。

基本上,查询执行的顺序是

1. FROM/JOIN
2. WHERE/ON   -- exception for LEFT JOIN
3. GROUP BY (incl. CUBE, ROLLUP, GROUPING SETS)
4. HAVING
5. SELECT
6. DISTINCT
7. ORDER BY

因此,为SELECT列创建的别名对WHERE和HAVING阶段不可见。它只是复制和粘贴表达式,非常简单。边缘情况可能是在处理长而复杂的公式时,这可能会更好地取消查询,例如。

select totalTime,
       execution_queued_timestamp
from (
    select (execution_end_timestamp - execution_queued_timestamp) as totalTime,
           execution_queued_timestamp
    from exec_queue
    where execution_name like '%Generate%'
      and execution_queued_timestamp > '2012-10-04 20:00:00.000'
) x
where totalTime < '1900-01-01 00:00:06.000'

我会给你一个提示。 SQL Server实际上知道将WHERE过滤器带入内部查询并将其应用于基表,因此不会损失性能!