知识文章 · 编写日期 2026-11-06
久久热资料筛选不等于某年为何漏掉空值
因为SQL中的未知值不能按普通年份直接判断相等或不等。按本文PostgreSQL规则,year <> 2005遇到NULL得到UNKNOWN,而WHERE只保留TRUE,所以未知年份不会自动进入结果。若任务明确要连未知一起保留,需要另写IS NULL条件。
本页延伸久久热资料档案的字段记录方法,采用公开SQL规则和原创虚构年份,不查询真实平台或人物。NULL专指数据库空值;不表示字符串“NULL”、数字0或已确认没有某项内容。示例不声称本站或同名平台采用PostgreSQL。
筛选没有返回,不等于证实相反
普通比较需要两边具有可比较的值。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普通不等比较的结果。
动手核对
- 明确year是标量整数列,未知用SQL NULL。
- 为每条记录计算普通比较的TRUE、FALSE或UNKNOWN。
- 确认任务是否需要将未知记录纳入结果。
- 分别核对不等比较、附加IS NULL及单独IS NULL三组结果。
常见问题
NULL <> 2005为什么不是真?
因为未知年份尚不能确定与2005不同,普通比较返回UNKNOWN。
给等于条件加NOT能找到空值吗?
不能靠这种改写得到TRUE;应按实际需求使用IS NULL等明确空值判断。
结果没有丙,是否原表删了丙?
不是。本例只是SELECT筛选结果,没有删除操作。
这里的NULL就是没有拍摄年份吗?
不能这样推断。本例只是虚构资料的未知年份字段,缺失原因需另外说明。
依据与延伸阅读
- PostgreSQL:Comparison Functions and Operators(PostgreSQL,核验日期 2026-11-06)
普通比较遇NULL产生未知;空值检验使用IS NULL;本页限定标量字段。
- PostgreSQL:The WHERE Clause(PostgreSQL,核验日期 2026-11-06)
WHERE只保留条件TRUE的行,FALSE或NULL结果不进入输出表。