26

我想让我的查询中的排序有条件,所以如果它满足条件,它应该按降序排序

例如:

SELECT * FROM Data ORDER BY SortOrder CASE WHEN @Direction = 1 THEN DESC END
4

5 回答 5

43

不要更改ASCor DESC,更改正在排序的事物的符号:

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 ;

如果您按非数字列排序,则需要找到使该列“负数”的表达式;编写一个函数来做到这一点可能会有所帮助。

于 2009-04-17T01:16:01.073 回答
12
SELECT * 
FROM Data 
ORDER BY 
Case WHEN @Direction = 1 THEN SortOrder END DESC, 
Case WHEN 1=1 THEN SortOrder END
于 2009-09-28T21:10:39.910 回答
9

您还可以使用支持所有列类型的方案:

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

于 2010-11-14T21:14:11.050 回答
1

我做过这样的事情

select productId, InventoryCount, 
    case 
    when @Direction = 1 then InventoryCount 
    else -InventoryCount 
    end as "SortOrder"
order by 3
于 2009-04-17T01:14:19.550 回答
0

无论数据类型如何,都以 ASC 或 DESC 顺序进行动态排序。

第一个示例按字母顺序排序,第二个示例使用数字。@direction 变量表示排序方向(0 = ASC 或 1 = DESC),[column] 是排序列。

这也适用于多列排序,如果放置在进一步的外部查询中,您可以隐藏 [row] 列。

DECLARE @direction BIT = 1 -- 0 = ASC or 1 = DESC

-- Text sort. 

SELECT 
    IIF(@direction = 0, ROW_NUMBER() OVER (ORDER BY [column] ASC), ROW_NUMBER() OVER (ORDER BY [column] DESC)) [row]
    , *
FROM
(   -- your dataset.
    SELECT N'B' [column] 
    UNION SELECT N'C' 
    UNION SELECT N'A'
) [data] ORDER BY [row] 

-- Numeric sort.

SELECT 
IIF(@direction = 0, ROW_NUMBER() OVER (ORDER BY [column] ASC), ROW_NUMBER() OVER (ORDER BY [column] DESC)) [row],
*
FROM
(   -- your dataset.
    SELECT 2 [column] 
    UNION SELECT 3 
    UNION SELECT 1
) [data] ORDER BY [row]
于 2021-11-25T15:00:08.590 回答