Not In运算符可消除表中的NULL值行

Tru*_*i J 2 sql t-sql sql-server

我想在TABLEA的COLUMNA中检索除1,2,3,4,5以外的值的所有行。

SELECT * FROM TABLEA WHERE COLUMNA NOT IN (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

但这也消除了COLUMNA中具有NULL值的行。

我不想消除NULL值行,并希望将这些行包括在结果集中。

另外,我可以尝试下面的查询相同

SELECT * FROM TABLEA WHERE COLUMNA NOT IN (1,2,3,4,5) OR COLUMNA  IS NULL.
Run Code Online (Sandbox Code Playgroud)

但是我想知道,为什么必须添加此OR条件?

Gor*_*off 5

为什么需要额外的?

NULL比较几乎总是导致NULL,而不是true或false。一个WHERE子句过滤掉所有非真正价值,所以他们得到过滤掉。

这就是SQL定义的方式NULL。为什么这样NULL定义?

NULL在SQL中并不意味着“丢失”。意思是“未知”。因此,结果<unknown> not in (1, 2, 3, 4, 5)为“未知”,因为该值可能为1或可能为0。因此将对其进行过滤。

我也注意到,SQL标准包括NULL-safe比较,IS NOT DISTINCT FROM以及IS DISTINCT FROM对应于=<>分别。这些NULL只是“任何其他值”,因此两个NULL值被视为相等。但是,据我所知,没有用于NULL-safe IN和的构造NOT IN