2010-10-07 103 views
12

在MS SQL Server 2008 R2中編寫存儲過程,我想避免使用DSQL ...條件SQL ORDER BY ASC/DESC爲阿爾法列

我想排序法(ASC或DESC)是有條件的。

如今,隨着數字列我會簡單地用一個case語句和否定價值效仿ASC或DESC ... 即:

... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC 

什麼是有這樣一個合適的方法alpha列?

編輯:我想到一個聰明的方式,但它似乎非常低效......我可以插入我的有序alpha列到自動編號的臨時表中,然後使用上述方法按自動編號排序。

EDIT2:

你們認爲這種做法是什麼?

ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC, 
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC 

我不知道,如果強制排序上均勻柱比從排序字符串獲得數字雖然

回答

27

一種選擇

;WITH cQuery AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY SortColumn) AS RowNum 
    FROM 
     MyTable 
) 
SELECT 
    * 
FROM 
    cQuery 
ORDER BY 
    RowNum * @Direction --1 = ASC or -1 = DESC 

或個案恕我直言,這更有效的是有點醜陋的

ORDER BY 
    CASE WHEN 'ASC' THEN SortColumn ELSE '' END ASC, 
    CASE WHEN 'DESC' THEN SortColumn ELSE '' END DESC 
+0

聰明,非常類似於我的解決方案我張貼的編輯。我希望得到比導出數據的另一個排序副本更有效率的東西,以產生一個數字排序順序.... – Matthew 2010-10-07 19:00:40

+0

@Matthew PK:你必須用字符串代替匹配的數字,或者爲非相關案件。沒有*真的*聰明我很害怕 – gbn 2010-10-07 19:04:21

+0

您如何看待我的第二次編輯中的「兩個ORDER BY子句」方法? – Matthew 2010-10-07 19:32:34

1

這是其中一種情況下,當特定的解決方案可能是最好的可以用通用的,特別是當我們處理大量的數據時。我想:

IF @OrderAscOrDesc = 0 THEN BEGIN 
    SELECT ... 
    FROM ... 
    ORDER BY [AlphaColumn] ASC 
END ELSE BEGIN 
    SELECT ... 
    FROM ... 
    ORDER BY [AlphaColumn] DESC 
END 

如果您對[AlphaColumn]索引,你有時可能會獲得更好的計劃,更具體的查詢,比通用一個尺寸適合所有人的一個。

編輯:方便代碼重用,你可以用你的內聯UDF選擇 - 它會執行一樣好:

IF @OrderAscOrDesc = 0 THEN BEGIN 
    SELECT ... 
    FROM YourInlineUdf(...) 
    ORDER BY [AlphaColumn] ASC 
END ELSE BEGIN 
    SELECT ... 
    FROM YourInlineUdf(...) 
    ORDER BY [AlphaColumn] DESC 
END 
+0

我同意你的原則,已經提出。在我的特定應用程序中,我不希望這樣做,因爲查詢相對較長並且使用多個連接。我的擔心是代碼重複6次左右,這使得維護和未來更新變得困難。 – Matthew 2010-10-07 21:00:21

+0

@Matthew PK:爲了便於代碼重用,你可以將你的選擇包裝在內聯UDF中 - 它的表現也會一樣 – 2010-10-07 21:35:21