4

こんにちは、以下のクエリは、より大きな複雑なクエリのプロトタイプです。問題は、ユーザー入力に基づいて、任意の列を任意の順序 (つまり、ASC と DESC) で並べ替えることができる必要があることです。

CREATE table #Table1(
Name varchar(10) PRIMARY key,
DOB DateTime,
Rate numeric(10,2)  
)

INSERT INTO #Table1 (Name,DOB,Rate) values ('Name1','2/2/2012',10.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name2','3/2/2012',120.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name3','4/2/2012',110.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name4','5/2/2012',140.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name15','6/2/2012',130.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name6','2/21/2012',1120.23)

Declare @SortColumn varchar(10)
DECLARE @SortExpression varchar (10)

SET @SortColumn = 'DOB'
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC

Select 
            Name,
            DOB,
            Rate,
            ROW_NUMBER() OVER 
                (ORDER BY 
                    CASE WHEN @SortColumn = 'Name' then Name
                         WHEN @SortColumn = 'DOB' THEN DOB
                         WHEN @SortColumn = 'Rate' THEN Rate
                    END  +  @SortExpression 
                ) AS RowNumber  
                FROM 
                #Table1
4

2 に答える 2

2

それを機能させるにはCAST()、次CONVERT()のものが必要なようです。CASE

Declare @SortColumn varchar(10)
DECLARE @SortExpression varchar (10)

SET @SortColumn = 'DOB'
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC

Select 
   Name,
   DOB,
   Rate,
   ROW_NUMBER() OVER 
   (ORDER BY 
       CASE WHEN @SortColumn = 'Name' then Name
            WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120)
            WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10))
       END  ASC
    ) AS RowNumberASC,
    ROW_NUMBER() OVER 
    (ORDER BY 
       CASE WHEN @SortColumn = 'Name' then Name
            WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120)
            WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10))
      END DESC
    ) AS RowNumberDESC
FROM Table1

デモで SQL Fiddle を参照してください

@Martin が指摘したようにASCDESCパラメータ化することはできません。

于 2012-08-22T16:43:35.723 に答える
0

ASCとを動的に切り替える必要がある場合DESCは、動的ステートメントを使用する必要があります。
SQLフィドルはこちらSQLインジェクションに注意してください!

EXECUTE(' SELECT Name, DOB, Rate,'
      + ' ROW_NUMBER() OVER( ORDER BY ' + @SortColumn + ' ' + @SortExpression
      + ' ) AS RowNumber'
      + ' FROM Table1');

クエリが複雑な場合は、ビューに入れてそのビューから選択し、その部分のコンパイル時チェックを許可することを検討してください。

于 2012-08-22T16:57:29.147 に答える