MS Sql:条件ORDER BY ASC/DESC问题

Shi*_*mmy 25 sql sql-server sql-order-by

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

例如:

SELECT * FROM Data ORDER BY SortOrder CASE WHEN @Direction = 1 THEN DESC END
Run Code Online (Sandbox Code Playgroud)

tpd*_*pdi 38

不要更改ASCDESC更改正在排序的东西的符号:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END asc;
Run Code Online (Sandbox Code Playgroud)

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 ;
Run Code Online (Sandbox Code Playgroud)

如果您使用非数字列进行排序,则需要找到使该列"为负"的表达式; 写一个功能来做到这一点可能有所帮助.


小智 10

SELECT * 
FROM Data 
ORDER BY 
Case WHEN @Direction = 1 THEN SortOrder END DESC, 
Case WHEN 1=1 THEN SortOrder END
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

  • @mulllhausen 默认情况下,它们会被“调用”,只是在 case 语句为 false 的情况下,它将为所有行返回 NULL,从而消除排序的影响。 (2认同)