我当时正在读一本sql书,其中一个问题是:
针对Sales.Customers表编写一个查询,该表为每个客户返回客户ID和区域。按区域对输出中的行进行排序,具有最后(在非空值之后)为空标记排序的.Note,即the中空标记的默认排序行为是先排序(在非空值之前)。

答案是:
SELECT custid, region
FROM Sales.Customers
ORDER BY
CASE WHEN region IS NULL THEN 1 ELSE 0 END, region;我可以理解这种想法,但仍然很困惑,例如,让我们使用= 9来记录:因为custid 9有一个空区域,所以在使用cstatement返回1的情况下,查询如下:
ORDER BY 1, region相当于:
ORDER BY custid, region --because custid is the first column那么,为什么缓冲器9不是在custid 10之前(输出中的第二个记录)?这不是需要先按垫子定货吗,所以9是在10点之前?
发布于 2019-04-17 10:59:18
所以这个问题就像 按1,区域排序
不,这是错误的。表达式CASE WHEN region IS NULL THEN 1 ELSE 0 END按行计算;1是值而不是列位置。ORDER BY中的列位置只能指定为文字而不能指定为表达式。所以这个:
custid region
8 NULL
9 NULL
10 BC
42 BC
45 CA变成:
custid region case...
8 NULL 1
9 NULL 1
10 BC 0
42 BC 0
45 CA 0排序的结果可以是:
custid region case...
10 BC 0
42 BC 0
45 CA 0
8 NULL 1
9 NULL 1或者:
custid region case...
42 BC 0
10 BC 0
45 CA 0
9 NULL 1
8 NULL 1发布于 2019-04-17 10:58:07
你的解释是不正确的。1是一个简单的数字,而不是列引用。
该查询相当于:
SELECT custid, region
FROM (SELECT c.*,
(CASE WHEN region IS NULL THEN 1 ELSE 0 END) as region_is_null
FROM Sales.Customers c
) c
ORDER BY region_is_null, region;这是ORDER BY中关于数字的一个重要区别。这句话:
ORDER BY 1引用第一列。然而,
ORDER BY 1 + 0是一个简单的数字表达式,它返回常量1 --并将导致Server中的一个错误(它不允许ORDER BY中的常量)。
发布于 2019-04-17 10:21:25
您可以在下面尝试--在您的情况下,0将先被接受,然后是1,因此您需要更改值的顺序,或者如果您不想更改值,则可以执行desc顺序。
SELECT custid, region
FROM Sales.Customers
ORDER BY
CASE WHEN region IS NULL THEN 0 ELSE 1 END, regionhttps://stackoverflow.com/questions/55725300
复制相似问题