【问题标题】:CASE Statement for Order By Clause with Multiple Columns and Desc/Asc Sort具有多列和 Desc/Asc 排序的 Order By 子句的 CASE 语句
【发布时间】:2014-11-20 20:09:45
【问题描述】:

继我之前的问题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 @OrderByColumn WHEN 2 THEN Surname END ASC 

这很好用,但有时我需要的不仅仅是按顺序排列的列。我实际上需要这样的东西:

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

我不知道如何使CASE 语句允许THEN 部分中有多个列。

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:

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

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

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

    case语句如果条件不满足则返回null,所以实际上意思是:

    CASE @OrderByColumn WHEN 1 THEN Forename ELSE NULL END
    

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

    【讨论】:

    • 通过这种形式,您可以在每个单独的@OrderByColumn 案例和最佳答案中多次指定一列
    【解决方案2】:

    你需要这个吗?

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

    【讨论】:

    • 不管DateLocation 都不会这样排序吗?
    • 在这种形式中你不能在第二种情况下指定DateLocation
    • 这个答案的文字格式比较混乱,@OrderByColumn 为 2 时会按“NULL, Date, Location, Surname”排序。
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2021-12-13
    • 2017-04-10
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多