2

我在 SQL Server 中有一个表,我需要在其中选择根据值排序的数据。例如,

  • 如果排序值为1,那么我需要先按column1、column2再column3排序。

  • 如果排序值为2,那么我需要按column2,column1,column3排序。

  • 如果排序值为3,那么我需要按column3、column1、column2排序。

谁能告诉我如何在不使用 if else 的情况下在 SQL 中实现这一点,如下所示:

IF @SortOrder = 1
THEN
    SELECT * 
    FROM table 
    ORDER BY c1, c2, c3
END

IF @SortOrder = 2
THEN
    SELECT * 
    FROM table 
    ORDER BY c2, c1, c3
END

IF @SortOrder = 3
THEN
    SELECT * 
    FROM table 
    ORDER BY c3, c1, c2
END
4

5 回答 5

4

您可以CASE EXPRESSION用于条件排序:

SELECT * FROM Table
ORDER BY CASE WHEN @SortOrder = 1 then c1
              WHEN @SortOrder = 2 then c2
              ELSE c3
         END,
         CASE WHEN @SortOrder = 1 then c2
              ELSE  c1
         END,
         CASE WHEN @SortOrder in(1,2) then c3
              ELSE c2
         END
于 2016-03-31T10:08:17.333 回答
4

使用 CASE 是正确的。如果列 (c1,c2,c3) 中的数据类型冲突,则需要此语法。

ORDER BY
  CASE WHEN @SortOrder = 1 THEN c1 END,
  CASE WHEN @SortOrder = 1 THEN c2 END,
  CASE WHEN @SortOrder = 1 THEN c3 END,
  CASE WHEN @SortOrder = 2 THEN c2 END,
  CASE WHEN @SortOrder = 2 THEN c1 END,
  CASE WHEN @SortOrder = 2 THEN c3 END,
  CASE WHEN @SortOrder = 3 THEN c3 END,
  CASE WHEN @SortOrder = 3 THEN c1 END,
  CASE WHEN @SortOrder = 3 THEN c2 END
于 2016-03-31T10:53:53.147 回答
0

也许尝试这样 select * from table order by @SortOrder,c1,c2,c3 的事情:如果值代表列顺序,否则你可以尝试添加偏移量(例如@SortOrder + 4)

于 2016-03-31T10:03:56.563 回答
0

您可以在子句和值中使用CASE语句。(请注意,您可能需要检查使用此设置的性能。我通常没有问题,但我想我会注意的。)ORDER BYCOALESCE

SELECT *
FROM [TABLE]
ORDER BY
    CASE @SortOrder
    WHEN 1 THEN COALESCE(c1, N'') + N'-' + COALESCE(c2, N'') + N'-' + COALESCE(c3, N'')
    WHEN 2 THEN COALESCE(c2, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c3, N'')
    WHEN 3 THEN COALESCE(c3, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c2, N'')
        END

或者,如果您希望在结果中返回您排序的值(但排序顺序列必须是第一列)

SELECT
    CASE @SortOrder
    WHEN 1 THEN COALESCE(c1, N'') + N'-' + COALESCE(c2, N'') + N'-' + COALESCE(c3, N'')
    WHEN 2 THEN COALESCE(c2, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c3, N'')
    WHEN 3 THEN COALESCE(c3, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c2, N'')
        END AS SortOrder
    *
FROM [TABLE]
ORDER BY 1
于 2016-03-31T10:10:26.400 回答
0

我认为dynamic query这是条件排序的最佳方法

DECLARE @sql       VARCHAR(max),
        @SortOrder INT = 2

SET @sql = 'select * from table order by ' 
            + CASE @SortOrder WHEN 1 THEN 'c1,c2,c3' WHEN 2 THEN 'c2,c1,c3' WHEN 3 THEN 'c3,c1,c2' END 

--print @sql
exec (@sql)
于 2016-03-31T10:18:32.770 回答