【问题标题】:SQL Server - query not showing rows where column value is nullSQL Server - 查询不显示列值为空的行
【发布时间】:2019-03-16 21:53:04
【问题描述】:

我有一个这样的用户表 -

Table View

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

Query view

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

Query Result

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

【问题讨论】:

  • NULL 值是特殊值,不能使用常用的相等运算符“=”、“!=”和“”。您必须对这些值使用“IS NULL”和“IS NOT NULL”。
  • 感谢先生,您的友好回复。我现在明白了。 :)

标签: asp.net sql-server


【解决方案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】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      这是正确的:

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

      【讨论】:

      • 我猜,它会是 FacultyId='CSE001'。但是,我可以看到我做错了什么...谢谢先生,您的帮助... :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多