小编典典

SQL:order by子句中的case语句

sql

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

这是我得到的一个结果:

BusinessEntityID,SalariedFlag

7,1

5,1

3,1

1,1

2,0

4,0

6,0

8,0

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


阅读 205

收藏
2021-04-14

共1个答案

小编典典

sort子句等效于以下内容,这可能会更加明显:

ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID ELSE null END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID ELSE null END;

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

那是主要的排序,对于次要的排序,发生的事情大致相同:
SalariedFlag =
0的所有行都将按BusinessEntityID排序。由于它们的主要排序字段全为空,因此它们最终将按BusinessEntityID进行排序。

并且SalariedFlag!= 0的所有行都将以空的第二顺序分组在一起。如果这些行的SalariedFlag =
1,那么它们将已经按照主要顺序进行了排序。

如果SalariedFlag只能为0或1,则可以将这种排序(略)简化为:

ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        , BusinessEntityID;
2021-04-14