具有多列的SELECT动态排序

时间:2010-11-11 12:48:59

标签: sql sql-server

当ORDER BY基于CASE语句时,选择多个ORDER BY列的正确MS SQL语法是什么?

以下单列工作正常,但我需要按多列排序:

SELECT * FROM Products
ORDER BY 
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END <-- problem line

5 个答案:

答案 0 :(得分:40)

你可以试试这个

SELECT * FROM Products
ORDER BY 
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price END DESC, 
CASE WHEN @SortIndex = 2 THEN Title END ASC 

答案 1 :(得分:6)

@Brad。帕维尔建议如下(我认为),

DECLARE @query VARCHAR(MAX)

SET @query = 'SELECT * FROM Products 
              ORDER BY  
              '

IF (@SortIndex = 1) 
    SET @query =@query  + ' Price ASC '
ELSE IF (@SortIndex = 2) 
    SET @query =@query  + ' Price DESC, Title ASC '

sp_executesql @query

为什么你认为动态sql不适合复杂的存储过程?这些正是您应该使用动态SQL的地方,因为它可以帮助降低复杂性并解决参数嗅探等问题。我同意动态sql有它的缺点,但我建议你至少尝试一下,如果它适合你。

答案 2 :(得分:2)

尝试将此作为对服务器性能的较小影响 - 假设您在@SortIndex(1和2)中只有2个值。如果没有,请扩展您的If以及更多条件。

If @SortIndex = 1   
BEGIN
    SELECT * FROM Products ORDER BY Price ASC   
END
ELSE
BEGIN
    SELECT * FROM Products ORDER BY Price DESC, TITLE ASC 
END

答案 3 :(得分:1)

这样做......并告别你的表现。不幸的是,最好的解决方案是使用动态sql。

答案 4 :(得分:1)

你可以改写这个:

ORDER BY 
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END

as

CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC END, 
Title ASC

这会将添加的排序列添加到所有情况,但在我的情况下,这就是我想要的。

您也可以这样做(仅举例):

CASE WHEN @SortIndex = 1 THEN Price END ASC,Title ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC END