引用WHERE子句中的列别名

问题描述 投票:155回答:7
SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120

我知道

“无效的列名daysdiff”。

Maxlogtm是日期时间字段。是让我发疯的小东西。

sql sql-server tsql sql-server-2005
7个回答
180
投票
SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

通常,您不能在WHERE子句中引用字段别名。 (将其视为包含别名的整个SELECT,在WHERE子句之后应用。)

但是,如其他答案中所述,您可以强制SQL在SELECT子句之前处理WHERE。通常使用圆括号来强制操作的逻辑顺序或使用公用表表达式(CTE):

括号/子选择:

SELECT
   *
FROM
(
   SELECT
      logcount, logUserID, maxlogtm,
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary   
) as innerTable
WHERE daysdiff > 120

或查看亚当的相同CTE版本的答案。


71
投票

如果要在WHERE子句中使用别名,则需要将其包装在子选择或CTE中:

WITH LogDateDiff AS
(
   SELECT logcount, logUserID, maxlogtm
      , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120

10
投票

不重复代码的最有效方法是使用HAVING而不是WHERE]

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120

9
投票

如果您不想在CTE中列出所有列,另一种方法是使用outer apply

outer apply

6
投票

如何使用子查询(这在Mysql中对我有用)?

select
    s.logcount, s.logUserID, s.maxlogtm,
    a.daysdiff
from statslogsummary as s
    outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120

5
投票

具有在MySQL中的功能根据文档:

HAVING子句已添加到SQL,因为WHERE关键字无法与聚合函数一起使用。


4
投票

您可以引用列别名,但需要使用SELECT * from (SELECT logcount, logUserID, maxlogtm , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary) as 'your_alias' WHERE daysdiff > 120 进行定义:

CROSS/OUTER APPLY

SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff FROM statslogsummary s CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c WHERE c.daysdiff > 120;

优点:

  • 单个表达式的定义(易于维护/无需复制粘贴)
  • 无需使用CTE /外部查询包装整个查询
  • 可能引用DBFiddle Demo
  • 可能会有更好的性能(单次执行)

0
投票

我将如何过滤用WHERE/GROUP BY/ORDER BY创建的列?我试图只返回具有row_num值= 1的行。

© www.soinside.com 2019 - 2024. All rights reserved.