2012-08-15 60 views
1

其他地方我有以下查詢:參考別名在SELECT列表

select FirstName, LastName, 
    Case 
    When LastName = 'Jones' 
    then 'N/A' 
    End as Other, 
    Case 
     When Other is not null 
     then 1 
    else 0 as Flag 

的標誌值依賴於其他,但作爲其他是一個別名,標誌字段不能識別其他。

我想,我可以在一個選擇使用一個選擇。有沒有更好的方法讓Flag識別Other別名列?

回答

5

您不能引用別名選擇和訂購的外受,因爲方式的查詢分析。典型的解決方法是把它埋在派生表:

SELECT 
    FirstName, LastName, Other, 
    Flag = CASE WHEN Other IS NOT NULL THEN 1 ELSE 0 END 
FROM 
(
    SELECT FirstName, LastName, 
    CASE WHEN LastName = 'Jones' 
    THEN 'N/A' 
    END AS Other 
    FROM dbo.table_name 
) AS x; 
+0

geez我討厭這個MSSQL。無用的貢獻,我知道。 – youcantryreachingme 2017-07-31 23:11:41

+0

@youcantryreachingme這實際上就是每個遵循標準的RDBMS。 – 2017-08-01 01:58:37

0

你將不得不使用SELECTSELECT

SELECT FirstName, LastName, Other, 
    Case When Other is not null 
     then 1 
     else 0 END as Flag 
FROM 
(
    select FirstName, LastName, 
     Case 
     When LastName = 'Jones' 
     then 'N/A' 
     End as Other 
    from yourTable 
) x 

或評估的時候可以重複使用的OtherCASE聲明Flag字段:

select FirstName, 
    LastName, 
    Case 
     When LastName = 'Jones' 
     then 'N/A' 
    End as Other, 
    case when LastName = 'Jones' -- your Other CASE code here 
     then 1 
     else 0 
    END as flag 
from yourTable 
1

你也可以用公用表格表達n(CTE):

;WITH cte AS 
(
SELECT 
    firstname, 
    lastname, 
    CASE WHEN lastname = 'Jones' THEN 'N/A' 
    END AS Other 
FROM @t 
) 
SELECT 
    firstname, 
    lastname, 
    CASE WHEN other IS NOT NULL THEN 1 
     ELSE 0 
    END AS Flag 
FROM cte