为什么首先对 NULL 进行排序?

Ric*_*ard 20 sql-server database-theory sorting

为什么当我们在列中有一个 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
Run Code Online (Sandbox Code Playgroud)

结果是

NULL
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

我一直认为 NULL 意味着“不确定”或可能的“未知”。如果这是真的,它们会不会排在最后,因为该值可能大于所有其他值?(或者这是某个地方的排序选项?)

我使用的是 SQL Server 2008R2,但我怀疑这适用于所有 SQL Server,并且可能适用于所有 RDBMS。

Mar*_*ith 20

BOL:NULL 值表示该值未知。NULL 值不同于空值或零值。没有两个空值是相等的。两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。

NULL 表示未知。没有其他解释是有效的。

如果这是真的,它们会不会排在最后,因为该值可能大于所有其他值?

没有不可能。没有潜在价值。未知是未知是未知。

至于为什么它首先出现而不是最后出现,这不是已发布的 SQL 标准所满足的,不幸的是由 RDBMS 供应商自行决定:

维基百科:SQL 标准没有明确定义 Null 的默认排序顺序。相反,在符合要求的系统上,可以分别使用 ORDER BY 列表的 NULLS FIRST 或 NULLS LAST 子句在所有数据值之前或之后对空值进行排序。然而,并非所有 DBMS 供应商都实现了此功能。未实现此功能的供应商可能会为 DBMS 中的 Null 排序指定不同的处理方式。


ype*_*eᵀᴹ 6

您是正确的,NULL可以表示“不确定”或“未知”或“尚不知道”或“未申请”。但是没有理由将 Null 放在首位或最后。如果我们不知道实际值,那么 tehy 可大可小。

我认为在排序期间确定 Nulls 所需行为的标准是:

ORDER BY 
    test NULLS LAST                      --- or NULLS FIRST for the opposite
Run Code Online (Sandbox Code Playgroud)

不幸的是,SQL-Server 还没有采用这种语法。如果我没记错,PostgreSQL 和 Oracle 都有。

一种解决方案:

ORDER BY 
     CASE WHEN test IS NOT NULL 
            THEN 0 
          ELSE 1 
     END 
   , test
Run Code Online (Sandbox Code Playgroud)

另一个需要根据数据类型进行调整的解决方案 - 但不会很好地执行,因为它不能在 上使用索引(test)

ORDER BY 
    COALESCE(test, 2147483647)               --- if it's a 4-byte signed integer
Run Code Online (Sandbox Code Playgroud)