【问题标题】:Why is NULL considered a special case in SQL?为什么 NULL 被认为是 SQL 中的一种特殊情况?
【发布时间】:2021-06-07 20:29:02
【问题描述】:

假设如下数据库表:

帐户

id externalId firstName lastName
4c8e49a6-b148-4125-9352-c2effda744b8 null Alan Turing
9bb67137-07cf-413b-8f7e-d710a9c52c19 null Bill Gates
7510fe8e-a976-4258-bf5a-a314373f6743 'abc' Charles Babbage
62222be0-5e85-4333-9683-7b2de03073c5 'xyz' Dennis Richie

以下查询返回以下结果:

SELECT TOP (1000) [id]
      ,[externalId]
      ,[firstName]
      ,[lastName]
  FROM [ExampleDb].[dbo].[Accounts]
WHERE [externalId] != 'abc'
id externalId firstName lastName
62222be0-5e85-4333-9683-7b2de03073c5 'xyz' Dennis Richie

为什么此查询不返回 externalId 为 null (null != 'abc') 的行?

【问题讨论】:

  • 没有“特殊情况”。这就是NULL 的定义方式以及它的永久定义方式。
  • 你可以试试null is distinct from 'abc'和null is not distinct from 'abc'

标签: sql


【解决方案1】:

这就是NULL 的定义方式。时期。它在语义上意味着“未知值”,而不是“缺失值”。所以NULL != 'abc' 返回NULL,因为值未知。而WHERE 只返回明确评估为“真”的表达式。

您真正的问题是为什么 SQL Server 不支持 NULL 安全比较运算符。所以定义NULL行为的同一标准也定义IS DISTINCT FROM做你想做的事:

where externalId is distinct from 'abc'

问题是为什么 SQL Server 不支持此功能。

【讨论】:

  • 是否有“...为什么 SQL Server 不支持此功能”的答案?
  • @MatthewLayton 。 . .曾几何时,答案是“Sybase 不支持它”,因为那是 SQL Server 的代码库。然而,那是在NULL-safe 比较出现在标准之前(我认为)。从那以后,我只是假设微软没有收到足够的请求来支持这个功能。
  • @MatthewLayton - 因为有很多好主意被问到,然后ignored for decades
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2018-05-21
相关资源
最近更新 更多