web-dev-qa-db-ja.com

アルファ列の条件付きSQLORDER BY ASC / DESC

MS SQL Server 2008 R2でストアドプロシージャを作成しているので、DSQLの使用を避けたい...

ソート方法(ASCまたはDESC)を条件付きにしたいのですが。

さて、数値列では、caseステートメントを使用し、値を否定してASCまたはDESCをエミュレートします...つまり:

... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC

アルファ列でこれを行うための適切な方法は何ですか?

編集:私は賢い方法を考えましたが、それはひどく非効率的です...私は注文したアルファ列を自動番号付きの一時テーブルに挿入し、上記の方法を使用して自動番号で並べ替えることができました。

EDIT2:

このアプローチについてどう思いますか?

ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC,
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC

均一な列に並べ替えを強制する方が、並べ替えられた文字列から数値を取得するよりも効率的かどうかはわかりませんが

14
Matthew

1つのオプション

;WITH cQuery AS
(
   SELECT
       *,
       ROW_NUMBER() OVER (ORDER BY SortColumn) AS RowNum
   FROM
       MyTable
)
SELECT
   *
FROM
   cQuery
ORDER BY
   RowNum * @Direction --1 = ASC or -1 = DESC

または私見が少し醜いケース

ORDER BY
  CASE WHEN 'ASC' THEN SortColumn ELSE '' END ASC,
  CASE WHEN 'DESC' THEN SortColumn ELSE '' END DESC
30
gbn

これは、特に大量のデータを処理する場合に、特定のソリューションが一般的なソリューションよりも望ましい場合の1つです。私は...するだろう:

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  ... 
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  ... 
  ORDER BY [AlphaColumn] DESC
END

[AlphaColumn]にインデックスがある場合は、一般的な1つのサイズですべてに対応するクエリよりも、より具体的なクエリを使用した方が良いプランが得られる場合があります。

編集:コードの再利用を容易にするために、選択したものをインラインUDFでラップできます。これも同様に機能します。

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  YourInlineUdf(...)
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  YourInlineUdf(...) 
  ORDER BY [AlphaColumn] DESC
END
1
A-K