为什么(Col <>值AND Col为null)不返回任何null?

时间:2019-04-04 15:33:40

标签: tsql sql-null

我有一个应用程序,用户可以在页面上选择各种选项,而后面的代码将构建SQL查询以返回相关记录。

在这种情况下,用户选择了:

  • 除法!='1'

还有一个自动限制,因为返回记录的分部必须位于UserDivisions中,该变量看起来像

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

因此返回的记录必须在列出的分区之一中,或者将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')

此查询返回所有分区='1.1'和'1.1.1'的记录,并且不返回分区'1'中的任何记录,就像它应该返回的一样,但它也不返回任何分区为'Di'的记录=空。

我如何构建该查询以返回NULL,为什么上面的查询不返回NULL?

2 个答案:

答案 0 :(得分:1)

and (Division <> '1')消除了空值。这是因为无法将null评估为<>'1'。 RDBMS返回“未定义”。未定义不是正确的,将被排除。

您可以改为执行此操作;但似乎很奇怪,因为您想要除法1然后将其排除。

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

答案 1 :(得分:0)

当您将NULL与一个值进行比较时,它总是返回undefined

...这不是真的,因此评估为假。因此AND (Division <> '1')将从返回集中删除所有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'))