当ColumnName为变量时按顺序排序

时间:2016-04-15 17:24:38

标签: sql case

我见过很多人在CASE WHEN语句的ORDER BY子句中使用Select的例子。通常,他们将变量的值与列名的字符串进行比较。

这很好但是当你有一个非常宽的桌子时呢?

你能不能说出像

这样的话
ORDER BY 
    CASE WHEN @SortDesc = 1 THEN @SortField END DESC,
    CASE WHEN @SortDesc = 0 THEN @SortField END ASC 

或者,您真的必须在结果集中为每个列添加CASE WHEN吗?编辑:请注意,这是从SQL字符串转换为普通的旧SQL,因此动态构建并将其作为字符串执行不是一种选择。

2 个答案:

答案 0 :(得分:0)

您可以为此类建立动态sql字符串:

DECLARE @SortDesc varchar(max)
SELECT @SortDesc = [query to get your Sort column name].

DECLARE @sql varchar(max) = 'SELECT * FROM TABLE ORDER BY ' + @SortDesc

exec(@sql)

答案 1 :(得分:0)

  

或者你真的必须为每一列提供一个CASE WHEN   结果集?
      订购单           @SortDesc = 1时的情况@SortField END DESC,
          情况@SortDesc = 0那么@SortField END ASC

重点是您显示的代码不会有订单。 @SortField在所有记录上被替换为相同的值,并且您根本没有特殊订单。

你可以做的是解决一个@orderBy变量,控制像这样的真正的事情:

ORDER BY
CASE WHEN @orderBy = 'NameDesc'     THEN name       END DESC,
CASE WHEN @orderBy = 'NameAsc'      THEN name       END,
CASE WHEN @orderBy = 'someDateDesc' THEN someDate   END DESC,
CASE WHEN @orderBy = 'someDateAsc'  THEN someDate   END,
CASE WHEN @orderBy = 'IdDesc'       THEN Id         END DESC,
CASE WHEN @orderBy = 'IdAsc'        THEN Id         END

在这里,您按六个标准进行排序,但其中五个标准对所有记录都是空的,因此您的排序顺序是所选字段。是的,您需要编写您想要使用的所有变体。