我有一份聲明 - 簡化WHERE從CASE結果
SELECT UserID,
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 AS Deleted
FROM User
WHERE Deleted = 0;
但這不起作用,因爲Deleted
不能使用。
是否有解決方法?我無法以這種方式解決這個問題,因爲在我的真實聲明中這是一個巨大的子選擇。
我有一份聲明 - 簡化WHERE從CASE結果
SELECT UserID,
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 AS Deleted
FROM User
WHERE Deleted = 0;
但這不起作用,因爲Deleted
不能使用。
是否有解決方法?我無法以這種方式解決這個問題,因爲在我的真實聲明中這是一個巨大的子選擇。
將原始查詢包裝在派生表中。 (因爲列別名在同一查詢的where子句中不可用)。
select *
from
(
SELECT UserID,
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END AS Deleted
FROM User
) dt
WHERE dt.Deleted = 0;
我們可以像下面那樣使用沒有子查詢。
SELECT *
FROM [User]
WHERE (CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END)=0
現在「已刪除」字段丟失 – Toshi
刪除字段不是必需的。我們可以直接使用。爲什麼我們需要'刪除'字段? –
使用WHERE和子查詢的問題是什麼? –
如果您想知道爲什麼無法在where子句中引用列別名,這是所謂[邏輯處理順序](https://destinationdata.wordpress.com/2016/01/10/the-logical-processing-order-3/)的結果。 TL/DR:查詢中的每個子句都按設定的順序執行。每個子句的輸出成爲下一個的輸入。 select子句在where子句之後處理。 –
@ destination-data,這在許多方面都是錯誤的。整個語句在執行前處理,因此在執行時間內所有內容都是已知的。某些數據庫,例如Teradata支持SQL語句每個部分的別名。 –