Esta consulta funciona:
DECLARE @Ordering NVARCHAR(50)
SET @Ordering = 'aggregateid'
DECLARE @OrderDirectionInt INT
SET @OrderDirectionInt = 0 --1
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY
CASE WHEN LOWER(@Ordering) = 'aggregateid' AND @OrderDirectionInt = 1 THEN AggregateId END DESC,
CASE WHEN LOWER(@Ordering) = 'aggregateid' AND @OrderDirectionInt = 0 THEN AggregateId END ASC
) AS RowNumber,
MyField
FROM
MyTable
) AS TempResults
WHERE TempResults.RowNumber BETWEEN 12 AND 23
O que não entendo é por que ASC
e DESC
estão depois (ou fora) das CASE
instruções. Parece que o ASC
e DESC
está sendo colocado incondicionalmente, o que não faz sentido... pode resolver para:
ROW_NUMBER() OVER (ORDER BY
DESC,
AggregateId ASC
) AS RowNumber
Por que a CASE
instrução não contém o ASC
ou DESC
(se você tentar fazer isso, receberá um erro de sintaxe)?
ASC
eDESC
vir depois de umaCASE
cláusula?CASE
instrução não contém oASC
ouDESC
(se você tentar fazer isso, receberá um erro de sintaxe)?Porque uma
CASE
expressão (não é uma cláusula nem uma instrução) pode ter um valor/expressão como resultado, não palavras de código comoASC
ouFROM
. A sintaxe fornecida na documentação daCASE
expressão é:Pode resolver para:
Não, eu não posso. Devido à parte implícita
ELSE NULL
que todas asCASE
expressões têm como padrão, se você não fornecer.