通过在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的人聚在一起,原因是他们(看列A)都属于null,如果SalariedFlag有另一个值,比如数字2,那么该查询就不起作用了,具有相同标志的人不一定再次彼此相邻。
NULL首先排序,如果指定DESC,则会最后排序。
实时测试:
http://www.sqlfiddle.com/ !3 / 1b849 / 13
认识到该查询的CASE WHEN THEN使用整数类型的BusinessEntityID,您可以执行以下查询以实现相同的效果。由于它使用SalariedFlag作为分隔器,因此以下查询可能会更快,因为您没有在ORDER BY上使用条件语句。您可以切换SalariedFlag并对其进行排序。
SELECT BusinessEntityID, SalariedFlag,
A = BusinessEntityID * SalariedFlag,
B = BusinessEntityID * (SalariedFlag ^ 1)
FROM Employee
ORDER BY A DESC, B
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
Live test: http://www.sqlfiddle.com/#!3/e65ac/2