SQL Server-查询未显示列值为空的行

时间:2019-03-16 21:53:04

标签: asp.net sql-server

我有一个这样的Users表-

Table View

我正在使用以下查询来检索学院ID为CSE001,指定不是学生并且用户角色不是市场协调员的行-

Query view

但是它没有给我我想要的结果,因为我原本希望得到的2行在其UserRole列中为null。因此,它什么也不返回。

Query Result

那么,我该如何编写查询,以便即使UserRole列中的行为空,它也可以向我返回行?有人可以帮我吗?谢谢...

3 个答案:

答案 0 :(得分:1)

在SQL Server中,值可能会丢失但适用,例如尚未提供给人的头发的颜色值,或者可能会丢失但不适用,例如为粗体显示的人的值。无论哪种情况,SQL Server都会将缺少的值标记为NULL。 NULL既不是TRUE也不是FALSE,而是UNKNOWN。这是三值逻辑中的第三个值。换句话说,当您知道X = YX的值时,可以确定Y是TRUE还是FALSE,但是如果缺少X怎么办? SQL Server将返回UNKNOWN,标记为NULL。这是您的情况:您知道Y是已知的(等于'Marketing Coordinator'),但是可能缺少X。由于WHERE仅返回那些符合条件的行(即,每个谓词的求值为TRUE),因此UNKNOWN的结果将被过滤掉。

您将需要编写使用三值逻辑的查询来说明三种可能的结果:TRUEFALSEUNKNOWN。在ONWHEREHEAVING子句中,SQL Server将NULL视为FALSE。另一方面,ORDER BY首先将NULLs排序。

您可以使用NULLIS NULL运算符而不是相等的值来测试IS NOT NULL的值。

答案 1 :(得分:1)

检查Designation和UserRole是否包含NULL值。 对此类检查使用IS NULL或IS NOT NULL。这是因为您无法将NULL与特定值进行比较。

SELECT * FROM Users
WHERE FacultyId = 'CSE001'
AND (Designation <> 'Student' OR Designation IS NULL)
AND (UserRole <> 'Marketing Coordinator' OR UserRole IS NULL)

希望这会有所帮助。

答案 2 :(得分:0)

您明确要求输入NULL值,因为它们在关系数据库中非常特殊。

这是正确的:

SELECT *
FROM Users
WHERE FacultyId <>'CSE001'
AND Designation <> 'Student'
AND (UserRole <> 'Marketing Coordinator' OR UserRole IS NULL);