我想让我的查询中的排序有条件,所以如果它满足条件,它应该按降序排序
例如:
SELECT * FROM Data ORDER BY SortOrder CASE WHEN @Direction = 1 THEN DESC END
我想让我的查询中的排序有条件,所以如果它满足条件,它应该按降序排序
例如:
SELECT * FROM Data ORDER BY SortOrder CASE WHEN @Direction = 1 THEN DESC END
不要更改ASC
or 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 ;
如果您按非数字列排序,则需要找到使该列“负数”的表达式;编写一个函数来做到这一点可能会有所帮助。
SELECT *
FROM Data
ORDER BY
Case WHEN @Direction = 1 THEN SortOrder END DESC,
Case WHEN 1=1 THEN SortOrder END
您还可以使用支持所有列类型的方案:
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
我做过这样的事情
select productId, InventoryCount,
case
when @Direction = 1 then InventoryCount
else -InventoryCount
end as "SortOrder"
order by 3
无论数据类型如何,都以 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]