1

を使用して結果をページングするために使用されているSQLステートメントがありますROW_NUMBER()

SELECT * FROM (
    SELECT
        ROW_NUMBER() OVER ( ORDER BY [tbl1].[Col1] ASC ) As RowNumber,
        [tbl1].[Col1],
        [tbl1].[Col2],
        [tbl1].[Col3],
        ( SELECT [tbl2].[Col1] 
          FROM [tbl2] 
          WHERE [tbl2].[id] = [tbl1].[id] 
                AND [tbl2].[subid] = 2 ) As theColumnName
    FROM
        [tbl1]
) As tbl
WHERE RowNumber BETWEEN 1 AND 10

これはすべて正常に動作し、期待どおりです。ORDER BYただし、ストアド プロシージャに渡される値に基づいて、いくつかの追加機能を導入したいと考えています。

だから私は自分のROW_NUMBER() OVER (ORDER BY...声明を次のように更新しました

ROW_NUMBER() OVER (ORDER BY 
    CASE WHEN @sortBy = 'type1' THEN [tbl1].[Col1]
         WHEN @sortBy = 'type2' THEN [tbl1].[Col2]
    END,
    CASE WHEN @sortBy = 'type3' THEN [tbl1].[Col3]
    END
ASC) As RowNumber

ここでわかるように、メソッドCASE内にステートメントがあり、 は他の列とはデータ型が異なるため、が 2 つあります。OVER ()CASE[Col3]

theColumnNameこれで問題なく動作しますが、エラーメッセージが表示されるだけなので、列で注文する方法がわかりませんInvalid column name 'theColumnName'

WHEN @sortBy = 'type4' THEN theColumnName

たとえば、列番号を使用しようとしましたWHEN @sortBy = 'type4' THEN 5が、これも機能しません。

このカスタム列名で並べ替える方法はありますか?

4

1 に答える 1

3

from次のように、サブクエリを句に移動する必要があります。

SELECT
    ROW_NUMBER() OVER ( ORDER BY [tbl1].[Col1] ASC ) As RowNumber,
    [tbl1].[Col1],
    [tbl1].[Col2],
    [tbl1].[Col3],
    t2.col1 As theColumnName
FROM [tbl1] t join
     (select id, col1
      from tbl2
      where subid = 2
    ) t2
    on t.id = t2.id

t2.col1これで、row_number() order by句に含めることができます。

于 2013-01-16T11:39:09.187 に答える