SQL 服务器:比较 where 子句中可为空的列

SQL Server: Compare nullable column in where clause

我有一个关于 SQL 服务器的初学者问题。我通过设置 table A 的列等于 table B 中的列来将两个 table 相互链接。基本上,我的查询看起来像这样:

SELECT A.nr, [...]
FROM A, B
WHERE A.id = B.id
AND [...]

我现在的问题是 table B 中的 id 列也有一些空值。因此,如果 B.id 为空,则不会显示整行,因为不满足条件。但是,如果 B.id 为空,我只希望 A.nr 也为空,而不是整行不显示。我怎样才能做到这一点?

我考虑了以下几点:

SELECT A.nr, [...]
FROM A, B
WHERE A.id = B.id OR B.id IS NULL
AND [...]

但是该列只是混合了所有可能的 B.id 行,不是吗?

编写此逻辑的正确方法是使用显式 JOIN从不FROM 子句中使用逗号。 始终使用正确、明确、标准的JOIN语法。

在SQL服务器中,你需要这样表达:

SELECT A.nr, [...]
FROM A JOIN
     B
     ON (A.id = B.id OR (a.id IS NULL AND b.id IS NULL) )
WHERE . . .;

ANSI 标准SQL 有一个用于此目的的比较运算符,但SQL 服务器不支持它。这称为 NULL 安全比较:

SELECT A.nr, [...]
FROM A JOIN
     B
     ON A.id IS NOT DISTINCT FROM B.id 
WHERE . . .;