SQL:case语句按顺序by子句

Ziy*_*ang 3 sql sql-server case sql-order-by

http://msdn.microsoft.com/en-us/library/ms181765.aspx

我从上面的链接看到下面的sql:

SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
    ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO
Run Code Online (Sandbox Code Playgroud)

这是我得到的一个结果:

BusinessEntityID,SalariedFlag

7,1

5,1

3,1

1,1

2,0

4,0

6,0

8,0

谁能解释为什么具有相同salariedFlag的记录彼此相邻以及为什么salariedFlag = 1 chunk高于salariedFlag = 0块?

Adr*_*onk 5

sort子句等同于以下内容,可能稍微明显一些:

ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID ELSE null END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID ELSE null END;
Run Code Online (Sandbox Code Playgroud)

因此,当SalariedFlag = 1时,第一个排序字段是BusinessEntityID,或者为null.
这会将SalariedFlag = 0的所有行组合在一起,因为它们都具有空的第一个排序字段.
SalariedFlag = 1的行将按BusinessEntityID排序.看起来nulls以降序排序最后排序,所以所有SalariedFlag!= 1都排在最后.

这是主要的排序,对于二级排序,发生了同样的事情:
SalariedFlag = 0的所有行将按BusinessEntityID排序.由于它们的主要排序字段都是null,因此它们最终将由BusinessEntityID排序.

并且所有SalariedFlag!= 0的行将与空的二级排序组合在一起.如果这些行的SalariedFlag = 1,那么它们已经按主要排序排序.

如果SalariedFlag只能是0或1,那么这种类型可以(略微)简化为:

ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        , BusinessEntityID;
Run Code Online (Sandbox Code Playgroud)