2016-11-18 73 views
0

我有一份聲明 - 簡化WHERE從CASE結果

SELECT UserID, 
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 AS Deleted 
FROM User 
WHERE Deleted = 0; 

但這不起作用,因爲Deleted不能使用。

是否有解決方法?我無法以這種方式解決這個問題,因爲在我的真實聲明中這是一個巨大的子選擇。

+0

使用WHERE和子查詢的問題是什麼? –

+1

如果您想知道爲什麼無法在where子句中引用列別名,這是所謂[邏輯處理順序](https://destinationdata.wordpress.com/2016/01/10/the-logical-processing-order-3/)的結果。 TL/DR:查詢中的每個子句都按設定的順序執行。每個子句的輸出成爲下一個的輸入。 select子句在where子句之後處理。 –

+0

@ destination-data,這在許多方面都是錯誤的。整個語句在執行前處理,因此在執行時間內所有內容都是已知的。某些數據庫,例如Teradata支持SQL語句每個部分的別名。 –

回答

4

將原始查詢包裝在派生表中。 (因爲列別名在同一查詢的where子句中不可用)。

select * 
from 
(
    SELECT UserID, 
      CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END AS Deleted 
    FROM User 
) dt 
WHERE dt.Deleted = 0; 
+0

@Andrew L是SQL Server所需的dt表別名嗎?根據ANSI SQL它是可選的,但我知道一些產品需要它 - 但我永遠不會記得哪些產品。 – jarlh

+0

我想有一個'END'丟失...... – Shnugo

+0

它已經解決了,@jarlh,太急於回答:D ..而且之後沒有編輯!但是+1很酷的快速回復。 – Vikrant

0

我們可以像下面那樣使用沒有子查詢。

SELECT * 
FROM [User] 
WHERE (CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END)=0 
+0

現在「已刪除」字段丟失 – Toshi

+0

刪除字段不是必需的。我們可以直接使用。爲什麼我們需要'刪除'字段? –