2017-04-14 18 views
0

對於下面的簡化T-SQL語句條件ORDER BY不工作的臨時表

DECLARE @SortColumn nvarchar(50) 
SET @SortColumn = 'Price' 

SELECT Name, 1+1 as Price 
INTO #MyTempTable 
FROM Events 
ORDER BY 
    CASE 
     WHEN @SortColumn = 'Name' THEN Name 
    END, 
    CASE 
     WHEN @SortColumn = 'Price' THEN Price 
    END DESC 

爲什麼我得到錯誤:

Invalid column name 'Price'.

是否有可能排序計算列?

請注意,我的實際問題是一個更復雜的查詢的一部分,但這個簡化的例子確實證明了這個問題,並會引發錯誤。

回答

1

您可以order by計算字段。您不能在order by中包含表達式這樣的字段。以下是一種解決方法:

SELECT e.Name, v.Price 
INTO #MyTempTable 
FROM Events e OUTER APPLY 
    (VALUES (1 + 1)) v(price) 
ORDER BY (CASE WHEN @SortColumn = 'Name' THEN e.Name END), 
     (CASE WHEN @SortColumn = 'Price' THEN v.Price END DESC); 

也就是說,您可以使用OUTER APPLY定義表達式。然後可以像使用表格中的列一樣使用結果。

定義表達式基本沒有限制。可以包含FROM條款中較早出現的所有表中的列。

+0

看起來很有希望。所以我可以測試它,你能幫助我解決多個計算字段的語法問題嗎?價格和利潤? –

+0

關於我上面的評論,你只是做兩個外部申請 –

+0

丹,如果一個領域取決於另一個領域,你可以使用兩個「外部申請」。否則'(VALUES(1 + 1,2 + 2))v(a,b)'將起作用。 –