2009-04-02 16 views
4

私はストアドプロシージャ内に次のSQLを持っています。 IF文を削除し、 'ASC'/'DESC'オプションを変数として渡す方法はありますか?SQL Serverの並べ替え順序を変数に格納できますか?

多くの異なる方法でクエリを実行したり、テーブルを返して外部からソートすることができます.CASEステートメントの重複を避けることができるかどうかを知りたいと思います。

IF @sortOrder = 'Desc' 
    BEGIN 
    SELECT * FROM #t_results 
    ORDER BY 
    CASE WHEN @OrderBy = 'surname'   THEN surname END DESC, 
    CASE WHEN @OrderBy = 'forename'   THEN forename END DESC, 
    CASE WHEN @OrderBy = 'fullName'   THEN fullName END DESC, 
    CASE WHEN @OrderBy = 'userId'   THEN userId END DESC, 
    CASE WHEN @OrderBy = 'MobileNumber'  THEN MSISDN END DESC, 
    CASE WHEN @OrderBy = 'DeviceStatus'  THEN DeviceStatus END DESC, 
    CASE WHEN @OrderBy = 'LastPosition'  THEN LastPosition END DESC, 
    CASE WHEN @OrderBy = 'LastAlert'   THEN LastAlert END DESC, 
    CASE WHEN @OrderBy = 'LastCommunication' THEN LastCommunication END DESC, 
    CASE WHEN @OrderBy = 'LastPreAlert'  THEN LastPreAlert END DESC 
    END 
ELSE 
    BEGIN 
    SELECT * FROM #t_results 
    ORDER BY 
    CASE WHEN @OrderBy = 'surname'   THEN surname END DESC, 
    CASE WHEN @OrderBy = 'forename'   THEN forename END DESC, 
    CASE WHEN @OrderBy = 'fullName'   THEN fullName END DESC, 
    CASE WHEN @OrderBy = 'userId'   THEN userId END DESC, 
    CASE WHEN @OrderBy = 'MobileNumber'  THEN MSISDN END DESC, 
    CASE WHEN @OrderBy = 'DeviceStatus'  THEN DeviceStatus END DESC, 
    CASE WHEN @OrderBy = 'LastPosition'  THEN LastPosition END DESC, 
    CASE WHEN @OrderBy = 'LastAlert'   THEN LastAlert END DESC, 
    CASE WHEN @OrderBy = 'LastCommunication' THEN LastCommunication END DESC, 
    CASE WHEN @OrderBy = 'LastPreAlert'  THEN LastPreAlert END DESC 
    END 
END 

答えて

12

パスは、実際の数はちょうどあなたが正しく並べ替え、私は「を使用気づく文字列を作成してください

SELECT 
    dt.yourColumn1 
     ,dt.yourColumn2 
     ,dt.yourColumn3 
     ,CASE 
      WHEN @OrderBy>0 THEN dt.SortBy 
      ELSE NULL 
     END AS SortByAsc 
     ,CASE 
      WHEN @OrderBy<0 THEN dt.SortBy 
      ELSE NULL 
     END AS SortByDesc 
    FROM (SELECT 
       yourColumn1 
        ,yourColumn2 
        ,yourColumn3 
        ,CASE 
         WHEN ABS(@OrderBy) = 1 THEN surname 
         WHEN ABS(@OrderBy) = 2 THEN forename 
         WHEN ABS(@OrderBy) = 3 THEN fullName 
         WHEN ABS(@OrderBy) = 4 THEN CONVERT(varchar(10),userId) 
         WHEN ABS(@OrderBy) = 5 THEN CONVERT(varchar(10),MobileNumber 
         WHEN ABS(@OrderBy) = 6 THEN DeviceStatus 
         WHEN ABS(@OrderBy) = 7 THEN LastPosition 
         WHEN ABS(@OrderBy) = 8 THEN CONVERT(varchar(23),LastAlert,121) 
         WHEN ABS(@OrderBy) = 9 THEN CONVERT(varchar(23),LastCommunication,121) 
         WHEN ABS(@OrderBy) =10 THEN CONVERT(varchar(23),LastPreAlert,121) 
         ELSE NULL 
        END AS SortBy 
       FROM YourTablesHere 
       WHERE X=Y 
     ) dt 
    ORDER BY SortByAsc ASC, SortByDesc DESC 

で並べ替えるには、列であるYYYY- MM-DD hh:mm:ss.mmm 'を入力し、数字を文字列に入力します。私たちは通常複数の列をまとめていますので、姓で並べ替える場合はforenameも使用されます。複数の列を結合する場合は、ゼロまたはスペースで埋めなければならないことに注意してください。

SortByAsc列とSortByDesc列を結果セットに含めたくない場合は、全体を派生テーブルにラップします。

+0

派生テーブルまたは結果セット内にある必要はありません。 ORDER BY句で式を使用できます。私はあなたの応答を見た前に例を提出しました。 +1:データ型の同期に関する良い点。 –

+0

重複したCASE文を削除するには、それはカラム –

6

はい、動的クエリを使用する必要があります。

hereをご覧ください。 ASCである正@OrderBy int型、否定はDESCある中

+1

動的クエリには独自の問題があることに注意してください。これは、文字列を完全に制御していない(SQLインジェクションなど)場合に特に当てはまります。 – Richard

7

あなたはどのようにこの程度...ダイナミックSQLずに

SELECT 
    * 
FROM 
    My_Table 
WHERE 
    Whatever = @something 
ORDER BY 
    CASE @sort_order 
      WHEN 'ASC' THEN 
       CASE @order_by 
        WHEN 'surname' THEN surname 
        WHEN 'forename' THEN forename 
        WHEN 'fullname' THEN fullname 
        ELSE surname 
       END 
      ELSE '1' 
    END ASC, 
    CASE @sort_order 
      WHEN 'DESC' THEN 
       CASE @order_by 
        WHEN 'surname' THEN surname 
        WHEN 'forename' THEN forename 
        WHEN 'fullname' THEN fullname 
        ELSE surname 
       END 
      ELSE '1' 
    END DESC 
+0

でなければなりません。私は自分のコードを改訂し、CASE文の複製を排除する方法を求めています。私はORDER BYでそれができるとは思わない。また、私は私の正/負のパラメータの並べ替えが好きで、それを切り替えるには-1で倍数にアプリケーションで簡単です&値は、グリッドの列番号です。 –

+0

これは私とほとんど同じ解決策ですが、私は複製を削除しようとしていました。 –

+0

@mike申し訳ありませんが、あなたのコメントが見られる前にコメントしました –

1

それを行うことができます。そして、複数のケースを持っている理由はない

CASE WHEN @order_by = @order_by THEN @order_by END 

関連する問題