我有一个应用程序,用户可以在页面上选择各种选项,而后面的代码将构建SQL查询以返回相关记录。
在这种情况下,用户选择了:
还有一个自动限制,因为返回记录的分部必须位于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?
答案 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)
...这不是真的,因此评估为假。因此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'))