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
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的所有行组合在一起,因为它们都具有空的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;