我想动态设置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
答案 0 :(得分:1)
例如,您不能在案例表达式的结果中混合使用字符串和整数。
你可以尝试这样的事情:
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
请注意,由于无法使用索引,因此速度很慢。动态生成查询可以提供更好的性能。
答案 1 :(得分:0)
solution建议使用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
...
但是如果性能很重要,我会尝试动态生成查询。