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

问题描述 投票:0回答:3

我有一个像这样的用户表 -

Table View

我使用以下查询来检索教师ID为CSE001,指定不是学生而用户角色不是营销协调员的行 -

Query view

但它并没有给我我需要的结果,因为我期望得到的2行,在UserRole列中为null。所以,它什么都不返回。

Query Result

那么,我怎样才能编写查询,这样即使在UserRole列中它们为null,它也会返回行?有人可以帮帮我吗?谢谢...

asp.net sql-server
3个回答
1
投票

在SQL Server中,值可能会丢失但适用,例如尚未为某人提供的头发颜色的值,或者可能丢失但不适用的值,例如粗体的值。在任何一种情况下,SQL Server都会将缺失值标记为NULL。 NULL既不是TRUE,也不是FALSE,而是UNKNOWN。这是三值逻辑中的第三个值。换句话说,当你知道X = YX的值时,你可以确定Y是TRUE还是FALSE,但是如果缺少X怎么办? SQL Server将返回UNKNOWN,标记为NULL。这是你的情况:你知道Y是已知的(等于'营销协调员'),但X可能会丢失。因为WHERE只返回那些匹配条件的行(即每个谓词被评估为TRUE),所以UNKNOWN结果将被过滤掉。

您需要编写使用三值逻辑的查询来解释三种可能的结果:TRUEFALSEUNKNOWN。在ONWHEREHEAVING条款中,SQL Server将NULL视为FALSE。另一方面,ORDER BYNULLs排在第一位。

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


1
投票

如果它们包含NULL值,则检查Designation和UserRole。对这些类型的检查使用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)

希望这可以帮助。


0
投票

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

这是正确的:

SELECT *
FROM Users
WHERE FacultyId <>'CSE001'
AND Designation <> 'Student'
AND (UserRole <> 'Marketing Coordinator' OR UserRole IS NULL);
© www.soinside.com 2019 - 2024. All rights reserved.