为什么 (Column <> value AND Column is null) 没有 return 任何空值?

Why does (Col <> value AND Col is null) not return any nulls?

我有一个应用程序,用户可以在其中 select 关闭页面的各种选项,并且后台代码构建一个 SQL 查询以 return 相关记录。

在这种情况下,用户 selected:

还有一个自动限制,因为 returned 记录的分区必须在 UserDivisions 中,这是一个看起来像

的变量
Division IS NULL OR Division IN ('1','1.1','1.1.1')

因此 returned 记录必须在列出的部门之一中,或者具有 NULL 作为值。

我的代码目前正在单独处理这些限制,所以最终的SQL看起来像

Select top 1000 Division, WoNum, WoType 
From WorkOrder
Where (Division IS NULL OR Division IN ('1','1.1','1.1.1'))
AND (Division <> '1')

此查询 return 包含 Division = '1.1' 和 '1.1.1' 的所有记录,但 return Division '1' 中的任何记录都没有,就像它应该的那样,但它也不 return 任何 Division = Null 的记录。

如何将此查询也构建为 return NULL,为什么上面的查询不 return NULL?

and (Division <> '1') 消除空值。这是因为不能将 null 计算为 <> '1'。 RDBMS returns "undefined"。 Undefined 不正确并被排除在外。

你可以这样做;但这似乎很奇怪,因为你想要分区 1 然后排除它。

WHERE ((Division IN ('1','1.1','1.1.1') AND (Division <> '1')) OR Division IS NULL)

当您将 NULL 与一个值进行比较时,它总是 return 未定义

...这不是真的,因此评估为假。所以 AND (Division <> '1') 将从 return 集合中删除所有 NULL。

执行相同查询但包含空值的一些方法:

  • Where (Division IS NULL OR Division IN ('1','1.1','1.1.1')) AND (Division <> '1' OR Division IS NULL)

  • WHERE ((Division IN ('1','1.1','1.1.1') AND (Division <> '1')) OR Division IS NULL)

  • WHERE (ISNULL(Division,'') <> '1') AND (Division IS NULL OR Division IN ('1','1.1','1.1.1'))

  • WHERE (COALESCE(Division,'') <> '1') AND (Division IS NULL OR Division IN ('1','1.1','1.1.1'))

在功能上等同于

  • WHERE (CASE WHEN Division IS NULL THEN '' ELSE Division END) <> '1' AND (Division IS NULL OR Division IN ('1','1.1','1.1.1'))