1

我不太了解OVER,我想澄清一下我认为它做了什么。

如果我提供了排序类型、记录状态和会议日期:

我想默认按 MeetingDate 排序。我想在排序类型为 2 时按状态排序,然后按会议日期排序。

下面的代码会这样做吗?我的测试表明确实如此,但我可能会遗漏一些东西。

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder

更具体地说,如果 @SortType 为 1 是否适合认为代码分解为:

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder

我认为这可能会分解为:

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            Foo.MeetingDate DESC
    ) AS RowOrder

与(当 @SortType 为 2 时)相反:

  SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            Foo.FK_Status ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder
4

2 回答 2

2

CASE @SortType WHEN 2 THEN Foo.FK_Status END相当于CASE @SortType WHEN 2 THEN Foo.FK_Status ELSE NULL END。换句话说,如果 @SortType = 1 那么查询实际上是这样的:

SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            NULL ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder
于 2013-05-31T17:15:50.073 回答
1

RowOrder列将按照描述的顺序排列,但order by在查询末尾没有子句,无法保证行的排序顺序。

所以:

SELECT Foo.*,
       ROW_NUMBER() OVER (ORDER BY 
                          CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
                          Foo.MeetingDate DESC) AS RowOrder
FROM Foo;

- 可以以任何顺序出现,同时:

SELECT Foo.*
FROM Foo
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC;

- 将按照描述的排序顺序对输出进行排序(不包括 RowOrder 列)。

于 2013-05-31T17:17:25.130 回答