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

解決策の 1 つがMark Byersによって提案されました。

関数ROW_NUMBER()の結果を使用して並べ替えることもできます (注文の種類ごとに 1 つです)。ROW_NUMBER()ROW_NUMBER()

もう1つは、最初のクエリの結果(句はないと仮定します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 に答える