知识文章 · 编写日期 2026-11-06

久久热资料筛选不等于某年为何漏掉空值

因为SQL中的未知值不能按普通年份直接判断相等或不等。按本文PostgreSQL规则,year <> 2005遇到NULL得到UNKNOWN,而WHERE只保留TRUE,所以未知年份不会自动进入结果。若任务明确要连未知一起保留,需要另写IS NULL条件。

本页延伸久久热资料档案的字段记录方法,采用公开SQL规则和原创虚构年份,不查询真实平台或人物。NULL专指数据库空值;不表示字符串“NULL”、数字0或已确认没有某项内容。示例不声称本站或同名平台采用PostgreSQL。

久久热资料筛选图:1998、2005和NULL的比较结果及WHERE保留范围
原创SQL三行练习:普通不等比较与明确包含未知是不同查询任务。 本站原创知识示意图;例子为教学设定,不是软件或实景截图。

筛选没有返回,不等于证实相反

普通比较需要两边具有可比较的值。PostgreSQL文档说明,一边为NULL时,普通相等和不等比较均产生未知结果,不能直接当作TRUE或FALSE。WHERE遇到FALSE或NULL都不保留该行。

因此某条资料没出现在“年份不等于2005”的结果中,不足以说明它就是2005年。它也可能是年份未知。资料整理中若用这份结果继续做汇总,必须知道查询是“已知为其他年份”,还是“排除已知2005后保留其余”。

三条虚构记录,逐行计算

设甲的year为1998,乙为2005,丙为SQL NULL。对year <> 2005逐行求值:甲TRUE、乙FALSE、丙UNKNOWN。筛选只返回甲;图中将三种值分别写出,避免把未知省略后误读为FALSE。

改写为NOT(year = 2005)并不会让丙变成TRUE。对丙,内部相等比较仍未知,否定未知也不会创造一个已知年份。不要以为加上NOT就能把缺值补进集合。

把业务要求写清,再决定是否包含NULL

若目标是“所有已确认不为2005的记录”,原条件正好表达这个范围。若目标是“除已知2005之外,未知也暂留”,可明确写year <> 2005 OR year IS NULL,本例返回甲和丙。两种目标不同,不能只凭结果条数更多就说后一种总是正确。

若单独查看待补资料,使用year IS NULL,只返回丙。不要写year = NULL:在通常SQL语义下这仍是普通未知比较,不是检验空值。本文限定一个标量整数列,不讨论复合行空值的特殊规则。

查询条件不负责解释缺值原因

NULL本身并不告诉读者是来源没写、尚未核对还是导入失败。实际记录若需要区分这些状态,可以另有说明字段;不能从一次空值测试反推出缺失原因,更不能自动改成0或某个猜测年份。

示例只执行读取筛选,没有DELETE或UPDATE。丙不进入某个结果集,并不表示原表的丙被删除。展示层隐藏一行、查询没有选中一行、数据已被永久移除,分别需要对应证据。

用一个小对照让规则可复查

保留三条测试记录,在预期结果旁写甲/乙/丙的标识。先检查不等于条件只选甲,再检查加IS NULL后选甲丙,最后检查单独IS NULL只选丙。规则应先在明确题设里说清,才用于规模更大的资料表。

本例不含JOIN、排序或分页,也不讨论统计均值的缺值填补。它回答一个更具体的问题:为什么逻辑上“不是那个已知值”的口语,不能不加说明地等同于SQL普通不等比较的结果。

动手核对

  1. 明确year是标量整数列,未知用SQL NULL。
  2. 为每条记录计算普通比较的TRUE、FALSE或UNKNOWN。
  3. 确认任务是否需要将未知记录纳入结果。
  4. 分别核对不等比较、附加IS NULL及单独IS NULL三组结果。

常见问题

NULL <> 2005为什么不是真?

因为未知年份尚不能确定与2005不同,普通比较返回UNKNOWN。

给等于条件加NOT能找到空值吗?

不能靠这种改写得到TRUE;应按实际需求使用IS NULL等明确空值判断。

结果没有丙,是否原表删了丙?

不是。本例只是SELECT筛选结果,没有删除操作。

这里的NULL就是没有拍摄年份吗?

不能这样推断。本例只是虚构资料的未知年份字段,缺失原因需另外说明。

依据与延伸阅读

继续阅读