为什么当我们在一列中有一个NULL值并且我们按值升序排序时,NULL首先排序?
select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test
结果是
NULL
1
2
3
4
我一直认为 NULL 意味着“不确定”或可能的“未知”。如果这是真的,他们不会排在最后吗,因为该值可能大于所有其他值?(或者这是某个地方的排序选项?)
我在 SQL Server 2008R2 上,但我怀疑这在所有 SQL Server 中都是如此,并且可能在所有 RDBMS 中都是如此。
NULL 表示未知。没有其他解释是有效的。
不可能。_ 没有潜在价值。未知就是未知。
至于为什么它出现在第一个而不是最后一个,这不是已发布的 SQL 标准所满足的,不幸的是由 RDBMS 供应商自行决定:
你是对的,
NULL
可能意味着“不确定”或“未知”或“未知”或“未申请”。但是没有理由将 Nulls 放在首位或放在最后。如果我们不知道实际值,那么 tehy 可能很小也可能很大。我认为在排序过程中确定 Null 所需行为的标准是:
不幸的是,SQL-Server 还没有采用这种语法。如果我没记错的话,PostgreSQL 和 Oracle 都有。
一种解决方案:
另一种需要根据数据类型进行调整的解决方案 - 但不会很好地执行,因为它不能在 上使用索引
(test)
:我不知道为什么要这样做,但根据定义,NULLS 不能与非 NULLS 进行比较,因此它们要么必须在开始或结束时进行(马克的回答对此进行了更详细的介绍)。
要获得您想要的行为 - 据我所知,没有排序选项可以将空值放在最后,因此您必须使用计算列强制它们最后放置。
CASE WHEN ...
但是,在 SQL Server 中,当您的数据包含集合运算符 ( ) 时,您不能按计算列 ( ) 进行排序UNION ALL
。所以:最后将用于对空值进行排序。如果您必须使用
UNION
(或EXCEPT
或INTERSECTS
)来生成数据集,则将数据转储到上述临时表中。如果您正在处理数字,您也可以使用
NULL
是可能的最低值,因此DESC
将它们放在最后。同时,非空值的符号倒置,因此DESC
实际上是ASC
真实值。这应该比CASE
我想查询优化器也可以在test
列上使用索引更快。