为什么 ASC 和 DESC 出现在 *CASE 子句之后?

Jez*_*Jez 1 sql-server syntax

此查询有效:

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)

我不明白的是,为什么ASCDESC(或外)的CASE语句。看起来ASCDESC被无条件地放入,这是没有意义的......它可能会解决:

ROW_NUMBER() OVER (ORDER BY
    DESC,
    AggregateId ASC
) AS RowNumber
Run Code Online (Sandbox Code Playgroud)

为什么该CASE语句不包含ASCor DESC(如果您尝试这样做,则会出现语法错误)?

ype*_*eᵀᴹ 5

  • 为什么 do ASCand DESCcome一个CASE子句之后?
  • 为什么该CASE语句不包含ASCor DESC(如果您尝试这样做,则会出现语法错误)?

因为CASE 表达式(它既不是子句也不是语句)可以有一个值/表达式作为结果,而不是像ASCor 之类的代码字FROMCASE表达式文档中提供的语法是:

Searched CASE expression:
CASE
     WHEN Boolean_expression 
       THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END
Run Code Online (Sandbox Code Playgroud)

不,它不能。由于ELSE NULL所有CASE表达式都有默认的隐含部分,如果您不提供它。