在 WHERE 子句中引用列别名

新手上路,请多包涵
SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120

我明白了

“无效的列名 daysdiff”。

Maxlogtm 是一个日期时间字段。这是让我发疯的小事。

原文由 user990016 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 796
2 个回答
SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

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

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

括号/子选择:

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

或者查看 Adam 的 CTE 版本的答案。

原文由 Jamie F 发布,翻译遵循 CC BY-SA 3.0 许可协议

对我来说,在 WHERE 子句中使用 ALIAS 的最简单方法是创建一个子查询并从中进行选择。

例子:

 WITH Q1 AS (
    SELECT LENGTH(name) AS name_length,
    id,
    name
    FROM any_table
)

SELECT id, name, name_length FROM Q1 WHERE name_length > 0

原文由 Michael Henry 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进