SQL Server:比较where子句中的可空列

时间:2018-04-16 11:43:42

标签: sql sql-server nullable

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

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

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

我想到了以下内容:

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

然后该列只与所有可能的B.id行混合,没有?

1 个答案:

答案 0 :(得分:2)

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

在SQL Server中,您需要将其表达为:

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 Server不支持它。这称为NULL - 安全比较:

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