此查询有效:
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
Run Code Online (Sandbox Code Playgroud)
我不明白的是,为什么ASC和DESC在后(或外)的CASE语句。看起来ASC和DESC被无条件地放入,这是没有意义的......它可能会解决:
ROW_NUMBER() OVER (ORDER BY
DESC,
AggregateId ASC
) AS RowNumber
Run Code Online (Sandbox Code Playgroud)
为什么该CASE语句不包含ASCor DESC(如果您尝试这样做,则会出现语法错误)?
ASCand DESCcome在一个CASE子句之后? CASE语句不包含ASCor DESC(如果您尝试这样做,则会出现语法错误)?因为CASE 表达式(它既不是子句也不是语句)可以有一个值/表达式作为结果,而不是像ASCor 之类的代码字FROM。CASE表达式文档中提供的语法是:
Searched CASE expression:
CASE
WHEN Boolean_expression
THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Run Code Online (Sandbox Code Playgroud)
它可能会解决:
ROW_NUMBER() OVER (ORDER BY
DESC,
AggregateId ASC
) AS RowNumber
Run Code Online (Sandbox Code Playgroud)不,它不能。由于ELSE NULL所有CASE表达式都有默认的隐含部分,如果您不提供它。
| 归档时间: |
|
| 查看次数: |
1302 次 |
| 最近记录: |