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块?
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)
| 归档时间: |
|
| 查看次数: |
9858 次 |
| 最近记录: |