1

我想动态设置 order by 子句。我已经尝试过使用case.

但是在少数情况下它对我不起作用,我不明白为什么会这样。我尝试了以下链接http://www.sqlteam.com/article/dynamic-order-by这仅适用于 5-6 种情况,之后我收到转换错误。

ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage
          WHEN @OrderBY = 2 THEN Pla_HomeRuns
          WHEN @OrderBY = 3 THEN Pla_RBIs
          WHEN @OrderBY = 4 THEN Pla_StolenBases
          END DESC
4

2 回答 2

1

例如,您不能在 case 表达式的结果中混合字符串和整数。

你可以尝试这样的事情:

ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage END DESC,
         CASE WHEN @OrderBY = 2 THEN Pla_HomeRuns END DESC,
         CASE WHEN @OrderBY = 3 THEN Pla_RBIs END DESC,
         CASE WHEN @OrderBY = 4 THEN Pla_StolenBases END DESC 

请注意,这会很慢,因为无法使用索引。动态生成查询可以提供更好的性能。

于 2012-05-09T08:00:39.227 回答
0

Mark Byers提出了一种解决方案

您还可以使用函数ROW_NUMBER()的结果并按结果排序(每种类型的订单ROW_NUMBER()仍然一个)。ROW_NUMBER()

另一种是将第一次查询的结果(我假设没有TOP子句)保存在临时表中,然后用于IF返回结果。

就像是:

INSERT INTO #results
SELECT
  a, b, c
FROM
  table
...

IF @OrderBY = 1 THEN
  SELECT * FROM #results ORDER BY Pla_BattingAverage DESC
END

IF @OrderBY = 2 THEN
  SELECT * FROM #results ORDER BY Pla_HomeRuns DESC
END

...

但是,如果性能很重要,我会尝试动态生成查询。

于 2012-05-09T08:18:17.187 回答