2009-04-17 45 views

回答

36

不要改變ASCDESC,改變被分類,通過事物的標誌:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END asc; 

的OP問:

夥計們,我不是專家的SQL,請給我解釋一下什麼意思ID和-id,確實它控制排序方向?

id只是您正在排序的任何列; -id只是否定,id * -1。如果你被一個以上的列進行排序,你需要否定的每一列:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END 
CASE WHEN @Direction = 1 THEN -othercolumn else othercolumn END ; 

如果你通過一個非數字列排序,你需要找到使該列的表達式「負」;寫一個函數來做到這一點可能會有幫助。

+0

夥計們,我不是SQL專家,請解釋我是什麼意思id和-id,它是否控制了排序方向? – Shimmy 2009-04-17 01:18:18

1

我做了這樣的事情

select productId, InventoryCount, 
    case 
    when @Direction = 1 then InventoryCount 
    else -InventoryCount 
    end as "SortOrder" 
order by 3 
+0

我不明白你寫什麼,反正我是編輯我的查詢中的問題 請查看查詢。 – Shimmy 2009-04-17 01:16:26

+0

我的答案與被接受的答案基本相同,只不過他更好,邏輯完全在ORDER BY子句中,其中包含一個虛擬列並按其排序。 – MikeW 2009-04-17 20:03:23

9
SELECT * 
FROM Data 
ORDER BY 
Case WHEN @Direction = 1 THEN SortOrder END DESC, 
Case WHEN 1=1 THEN SortOrder END 
7

您也可以使用它支持所有字段類型的方案:

SELECT <column_list> FROM <table> ORDER BY CASE WHEN @sort_order = 'ASC' AND @sort_column = '<column>' THEN <column> END ASC, CASE WHEN @sort_order = 'DESC' AND @sort_column = '<column>' THEN <column> END DESC