为什么NOT IN(NULL)始终不返回任何内容

时间:2017-05-01 06:04:50

标签: sql sql-server tsql

我有下表:
My Table
并按照简单的查询:

SELECT * FROM dbo.Calendars WHERE calname NOT IN(NULL)

我的问题是为什么总是 NOT IN(NULL)什么都不返回? PS :无论您的桌子是什么,如果您将 NOT IN(NULL)添加到任何列的条件,结果就是什么都没有。 提前谢谢你:)

3 个答案:

答案 0 :(得分:7)

因为value equals NULL未定义,并且永远不会评估为True。 检查This post on bad practices。不要使用INNULL,请使用EXISTS来测试至少存在某一行的行。

答案 1 :(得分:3)

对于大多数数据库中的其他值,

NULL的处理方式不同。例如,这个谓词永远不会成立:

WHERE foo = NULL

如果foo的值确实为NULL,则此谓词为真:

WHERE foo IS NULL

对于您的问题,如果您只想检查calname是否为空,请使用以下谓词:

WHERE calname IS NOT NULL

另一方面,如果你有一组值,其中NULL是其中一个值(比如[1,2,3,4,NULL]),你仍然想要使用{ {1}}语法,你必须这样做:

NOT IN

编辑:执行此操作的另一种方法是,如果您被限制使用WHERE calname IS NOT NULL AND calname NOT IN(1, 2, 3, 4) 语法,则将NOT INCOALESCE转换为您肯定知道未存储的值那一栏。例如,如果calname只能取正整数值,那么我们可以这样做:

calname

答案 2 :(得分:3)

您的查询评估为calname<> null,这会导致UNKNOWN。

将您的查询更改为此

SELECT * FROM dbo.Calendars WHERE calname IS NOT NULL;