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中文網其他相關文章!