2009-04-17 39 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