如何在Access中比较具有Null值的字段

问题描述

我有一个查询,该查询查看一个表字段并匹配第二个表字段。它看起来要看两个字段是否不匹配。如果不匹配,则第二个表的字段必须替换第一个表的字段。当两个表字段中的任何一个字段为空值时,我都可以正常工作。我尝试在第一个表上使用isNull(),并且确实选择了不为null的值,但是如果将相同的函数应用于第二个表,则不会得到任何回报。

UPDATE [NAVAIR Deficiencies] INNER JOIN NAVAIR_Deficiencies_Temp ON [NAVAIR Deficiencies].[Unique Deficiency Code] = NAVAIR_Deficiencies_Temp.[Unique Deficiency Code] SET [NAVAIR Deficiencies].[Hull Q] = [NAVAIR_Deficiencies_Temp]![Hull Q],NAVAIR_Deficiencies_Temp.Changed = True
WHERE ((IsNull([NAVAIR Deficiencies]![Hull Q])<>[NAVAIR_Deficiencies_Temp]![Hull Q]));

解决方法

您遇到null <> null的事实。

如果您能够定义一个永远不会出现在两列中的字符串值,则您可以使用IsNull()来解决此问题:

IsNull([NAVAIR Deficiencies]![Hull Q],'§§§§') 
    <> IsNull([NAVAIR_Deficiencies_Temp]![Hull Q],'§§§§')

这会将两个空值视为相等,并认为一个空值不等于任何非空值。

或者,您可以使用布尔逻辑来枚举所有可能的情况

[NAVAIR Deficiencies]![Hull Q]) <> [NAVAIR_Deficiencies_Temp]![Hull Q]
or ([NAVAIR Deficiencies]![Hull Q] is null and [NAVAIR_Deficiencies_Temp]![Hull Q] is not null)
or ([NAVAIR Deficiencies]![Hull Q] is not null and [NAVAIR_Deficiencies_Temp]![Hull Q] is null)

用否定表达可能更简单:

not (
    [NAVAIR Deficiencies]![Hull Q]) = [NAVAIR_Deficiencies_Temp]![Hull Q]
    or ([NAVAIR Deficiencies]![Hull Q] is null and [NAVAIR_Deficiencies_Temp]![Hull Q] is null)
)