当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
答案 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