带有多列和Desc / Asc排序的子句的CASE语句

时间:2014-09-25 22:10:41

标签: sql sql-server-2012

继我之前的问题Case statement for Order By clause with Desc/Asc sort后,我有一个这样的陈述:

SELECT 
    *
FROM
    TableName
WHERE
ORDER BY 
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, 
    CASE @OrderByColumnWHEN 2 THEN Surname END ASC 

这很有效,但有时我需要的不仅仅是列中的列。我实际上需要这样的东西:

.....
ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename, Date, Location END DESC

我无法弄清楚如何使CASE语句允许THEN部分中的多个列。

2 个答案:

答案 0 :(得分:16)

你需要这个吗?

ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, Date, Location,
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 

答案 1 :(得分:13)

您可以编写多个案例,即使它们都具有相同的条件。

ORDER BY 
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, 
    CASE @OrderByColumn WHEN 1 THEN Date END DESC, 
    CASE @OrderByColumn WHEN 1 THEN Location END DESC, 
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 

实际上,您没有指定要排序的列,而是指定表达式。

如果不满足条件,case语句将返回null,因此实际上它意味着:

CASE @OrderByColumn WHEN 1 THEN Forename ELSE NULL END

因此,如果@OrderByColumn不为1,则语句将始终返回NULL。顺便说一句,这并没有将它排除在排序之外,而是将所有这些行放在结果中,使得'SurName'成为对这组行进行决定性排序。