0

我有一个应用程序,用户可以在其中选择页面上的各种选项,并且后面的代码会构建一个 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')

此查询返回 Division = '1.1' 和 '1.1.1' 的所有记录,并且它不会返回 Division '1' 中的任何记录,就像它应该返回的那样,但它也不会返回 Division = Null 的任何记录。

如何构建此查询以返回 NULL,为什么上述查询不返回 NULL?

4

2 回答 2

1

and (Division <> '1')消除空值。这是因为 null 无法计算为 <> '1'。RDBMS 返回“未定义”。Undefined 不正确并被排除在外。

你可以这样做;但这似乎很奇怪,因为您想要除法 1 然后将其排除。

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

于 2019-04-04T15:45:27.360 回答
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'))
于 2019-04-04T21:24:02.457 回答