通过在 SELECT 子句中包含 CASE WHEN 条件,您可以轻松地想象它为什么以这种方式排序:
SELECT BusinessEntityID, SalariedFlag,
CASE SalariedFlag WHEN 1 THEN BusinessEntityID END AS A,
CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END AS B
FROM Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
输出:
BUSINESSENTITYID SALARIEDFLAG A B
7 1 7 (null)
5 1 5 (null)
3 1 3 (null)
1 1 1 (null)
2 0 (null) 2
4 0 (null) 4
6 0 (null) 6
8 0 (null) 8
SalariedFlag 0 保持在一起的原因是它们都落在 null 下(查看 A 列),如果 SalariedFlag 有另一个值,比如数字 2,那将是完全不同的事情,并且该查询将不再起作用,那些具有相同的flag 不一定彼此相邻。
NULL 先排序,如果指定DESC,则最后排序。
现场测试:http ://www.sqlfiddle.com/#!3/1b849/13
认识到查询的 CASE WHEN 的 THEN 使用的是整数类型的 BusinessEntityID,您可以执行以下查询以达到相同的效果;并且由于它使用 SalariedFlag 作为分隔符,因此以下查询可能会更快,因为您没有在 ORDER BY 上使用条件。您可以切换 SalriedFlag 并对其进行排序:
-- just to visualize things up
SELECT BusinessEntityID, SalariedFlag,
A = BusinessEntityID * SalariedFlag,
B = BusinessEntityID * (SalariedFlag ^ 1)
FROM Employee
ORDER BY A DESC, B
-- in actual you do this:
SELECT BusinessEntityID, SalariedFlag
FROM Employee
ORDER BY BusinessEntityID * SalariedFlag DESC, BusinessEntityID * (SalariedFlag ^ 1)
鉴于此数据:
CREATE TABLE [Employee]
([BusinessEntityID] int, [SalariedFlag] int);
INSERT INTO [Employee]
([BusinessEntityID], [SalariedFlag])
VALUES
(10, 1),
(5, 1),
(9, 1),
(1, 1),
(2, 0),
(7, 0),
(6, 0),
(8, 0);
这是输出:
BUSINESSENTITYID SALARIEDFLAG A B
10 1 10 0
9 1 9 0
5 1 5 0
1 1 1 0
2 0 0 2
6 0 0 6
7 0 0 7
8 0 0 8
现场测试:http ://www.sqlfiddle.com/#!3/e65ac/2