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
均一な列に並べ替えを強制する方が、並べ替えられた文字列から数値を取得するよりも効率的かどうかはわかりませんが
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
これは、特に大量のデータを処理する場合に、特定のソリューションが一般的なソリューションよりも望ましい場合の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