2011-12-20 106 views
2

使用別名我有一個(SQL Server 2008中)查詢,如下所示:SQL:爲了case語句

Select *, column1+column2 as alias1 
From complaints 
Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then alias1 
End 

這是不行的,因爲訂購在一個case語句的別名是不允許的,它不識別別名1。

有沒有另一種方法可以做到這一點?

感謝

回答

3

無論是把它放在一個CTE,然後ORDER BY ...

; with cteQuery as (Select *, column1+column2 as alias1 from complaints) 
SELECT * from cteQuery Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then alias1 
End 

或只是複製別名實際引用的內容...

Select *, column1+column2 as alias1 
From complaints 
Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then column1+column2 
End 
+0

歡迎來到StackOverflow:如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」)以精確地設置格式語法突出它! –

+0

謝謝,我喜歡CTE的接近。我會嘗試! –

+0

它的工作,再次感謝! –

3

簡單的答案:

Select complaints.*, column1+column2 as alias1 
From complaints 
Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then column1+column2 
End 
+0

謝謝!在我的情況下,表達式很複雜,所以這可能會對性能產生影響?我也不喜歡重複... –

+1

我不知道性能,雖然通常磁盤訪問是比查詢性能計算更大的因素。 Stuart的第二個查詢和Andrew的第一個(基於CTE的)查詢中的子查詢方法整齊地刪除了重複。 –

2
Select *, column1+column2 as alias1 
From complaints 
Order by Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then column1+column2 
    End 

OR

SELECT * 
FROM ( Select *, column1+column2 as alias1 
    From complaints) c 
    Order by Case 
     When @param1 = 'filedate' then filedate 
     When @param1 = 'calc' then alias1 
     End 
+0

謝謝!在我的實際情況中,這是一個包含地理位置的複雜公式。第一個解決方案是否會成爲性能問題?看來第二個解決方案可能會解決我的問題!我會試試這個,讓你知道。 –