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 块之上?
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 的所有行分组在一起,因为它们都有一个空的第一排序字段。
Salaried Flag = 1 的行将按业务实体 IF 排序。看起来空值按降序排列在最后,因此所有 SalariedFlag != 1 都排在最后。
这是主要的排序,对于次要的排序,会发生同样的事情:
SalariedFlag = 0 的所有行都将按 BusinessEntityID 排序。由于它们的主要排序字段均为空,因此它们最终将按 BusinessEntityID 排序。
SalariedFlag != 0 的所有行都将按空二级排序分组在一起。如果这些行的 SalariedFlag = 1,那么它们已经按主要顺序排序。
如果 SalariedFlag 只能是 0 或 1,那么这种排序可以(稍微)简化为:
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
, BusinessEntityID;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)