如果使用Order By子句中的Case语句排序,则排序是不同的

时间:2017-12-15 05:48:23

标签: sql sql-server sql-server-2016

我正在执行2个不同的SQL查询,对我来说,它们应该产生相同的结果,但事实并非如此。排序顺序在第二个查询中更改。只是想知道它为什么会发生?

SELECT *
FROM CTE
ORDER BY ServiceDate
    ,ServiceTime
    ,CASE 
        WHEN SortProfile = 'Y'
            THEN SortOrder1
        ELSE SortOrder2
        END
    ,CASE 
        WHEN SortProfile = 'N'
            THEN SortOrder2
        ELSE SortOrder1
        END
    ,Price DESC
------------------------------------------------------------------------------------
Code    Date        Time        Price   SortProfile SortOrder2   SortOrder1
------------------------------------------------------------------------------------
38424   02/10/2015  13:12:00    0       N               14              9
38440   02/10/2015  13:12:00    0       N               14              9
41892   02/10/2015  13:12:00    0       N               25              13
38436   02/10/2015  13:12:00    0       N               25              11
18228   02/10/2015  13:12:00    0       N               25              15


SELECT *
FROM CTE
ORDER BY ServiceDate
    ,ServiceTime
    ,SortOrder2
    ,Price DESC

------------------------------------------------------------------------------------
Code    Date        Time        Price   SortProfile SortOrder2     SortOrder1
------------------------------------------------------------------------------------
38424   02/10/2015  13:12:00    0       N               14              9
38440   02/10/2015  13:12:00    0       N               14              9
18228   02/10/2015  13:12:00    0       N               25              15
38436   02/10/2015  13:12:00    0       N               25              11
41892   02/10/2015  13:12:00    0       N               25              13

3 个答案:

答案 0 :(得分:0)

试试这个:

select * from CTE
order by SortProfile ,
case when SortProfile  = 'Y' then SortOrderOne 
     else case when SortProfile = 'N' then SortOrdertwo 
          end
end DESC,
case when SortProfile  = 'Y' then SortOrdertwo
     else case when SortProfile = 'N' then SortOrderOne 
          end
end DESC

输出是:

SortOrderOne    SortOrderTwo    SortProfile
14              9               N         
14              9               N         
25              15              Y         
25              13              Y         
25              11              Y      

答案 1 :(得分:0)

在第一个排序中,您不需要按照以下两个顺序

WHEN SortProfile = 'Y'
        THEN SortOrder1
    ELSE SortOrder2
    END
,CASE 
    WHEN SortProfile = 'N'
        THEN SortOrder2
    ELSE SortOrder1
    END

使用其中任何一个因为它们产生相同的结果。

此外,似乎按顺序按顺序正确排序列,因为您的订单中的所有列都已正确排序。只需按条件顺序添加列[code]即可获得相同的结果。我认为这可能会解决问题

答案 2 :(得分:0)

To me they should produce the same results, but its not

两个结果都是正确的,因为最后3行在排序列中具有相同的值,因此这3行中的任何顺序都是可接受的。

对于这两个查询,您看到的差异由不同 execution plans解释(它们不同,因为其中一个查询包含SortOrder1中的order by和其他execution plan不是)。

当服务器详细说明SortOrder1时,它不知道您的查询是否会返回" Y"因此它会考虑use std::mem::discriminant; #[derive(PartialEq, Eq)] enum Foo { A, B(usize), } fn main() { let to_test = Foo::B(123); let some_bool = true; if discriminant(&to_test) == discriminant(&Foo::B(0)) && some_bool { println!("Do stuff"); } } 并将其用于第一个计划的排序,而不会在第二个计划中使用它。

你可以向自己证明这两个执行计划。