按 SQL 服务器中的多列排序
Order by multiple columns in SQL Server
我在 SQL 服务器中有一个 table,我需要在其中 select 根据值排序的数据。例如,
如果排序值为1,那么我需要先按column1,column2,column3排序。
如果排序值为2,那么我需要先按column2,column1,column3排序。
如果排序值为3,那么我需要先按column3,column1,column2排序。
任何人都可以告诉我如何在 SQL 中实现这个而不使用 if else,如下所示:
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
也许可以试试这样:
select * from table order by @SortOrder,c1,c2,c3
如果该值表示列顺序,否则您可以尝试添加一个偏移量(例如 @SortOrder + 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
您可以在 ORDER BY
子句和 COALESCE
值中使用 CASE
语句。 (请注意,您可能需要检查使用此设置的性能。我通常不会遇到问题,但我想我会注意到它。)
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
我认为 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)
使用 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
我在 SQL 服务器中有一个 table,我需要在其中 select 根据值排序的数据。例如,
如果排序值为1,那么我需要先按column1,column2,column3排序。
如果排序值为2,那么我需要先按column2,column1,column3排序。
如果排序值为3,那么我需要先按column3,column1,column2排序。
任何人都可以告诉我如何在 SQL 中实现这个而不使用 if else,如下所示:
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
也许可以试试这样:
select * from table order by @SortOrder,c1,c2,c3
如果该值表示列顺序,否则您可以尝试添加一个偏移量(例如 @SortOrder + 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
您可以在 ORDER BY
子句和 COALESCE
值中使用 CASE
语句。 (请注意,您可能需要检查使用此设置的性能。我通常不会遇到问题,但我想我会注意到它。)
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
我认为 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)
使用 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