SQL WHERE 子句和列别名:常见陷阱及其解决方案
SQL 查询通常涉及 SELECT
语句来检索和转换数据。 但是,当尝试使用 SELECT
子句中的 WHERE
列表中定义的列别名时,经常会出现问题。本文解释了为什么这不能直接起作用并提供了有效的解决方法。
考虑这个例子:
<code class="language-sql">SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary WHERE daysdiff > 120;</code>
此查询的目的是计算maxlogtm
与当前日期之间的差异,别名为daysdiff
,然后过滤daysdiff
超过120的结果。结果是? “无效的列名”错误。发生这种情况是因为 SQL 在 WHERE
列表之前处理 子句 ,这意味着别名 SELECT
尚未定义。daysdiff
1。使用子查询(或括号):
将 语句封装在子查询中会强制在 SELECT
子句求值之前创建别名:WHERE
<code class="language-sql">SELECT * FROM ( SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary ) AS innerTable WHERE daysdiff > 120;</code>
语句定义 SELECT
,然后外部查询基于这个新定义的列进行过滤。daysdiff
2。使用通用表表达式 (CTE):
CTE 提供了一种更具可读性的替代方案。 CTE 是在查询中定义的临时命名结果集:
<code class="language-sql">WITH DaysDiffCTE AS ( SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary ) SELECT * FROM DaysDiffCTE WHERE daysdiff > 120;</code>
充当包含计算的DaysDiffCTE
的临时表,允许daysdiff
子句正确引用它。WHERE
以上是为什么不能在 SQL WHERE 子句中使用列别名,以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!