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

vol*_*one 15 sql sql-server-2012

继我之前的问题之后,在这里使用Desc/Asc排序的Order By子句的Case语句我有这样的声明:

SELECT 
    *
FROM
    TableName
WHERE
ORDER BY 
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, 
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 
Run Code Online (Sandbox Code Playgroud)

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

.....
ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename, Date, Location END DESC
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ter 17

你需要这个吗?

ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, Date, Location,
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 
Run Code Online (Sandbox Code Playgroud)

  • 不管怎么样,"Date"和"Location"都不会这样吗? (3认同)
  • 在这种形式中,您不能在第二种情况下指定“日期”或“位置” (2认同)

Gol*_*rol 14

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

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

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

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

CASE @OrderByColumn WHEN 1 THEN Forename ELSE NULL END
Run Code Online (Sandbox Code Playgroud)

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

  • 通过这种形式,您可以在每个单独的“@OrderByColumn”案例和最佳答案中多次指定一列 (2认同)