SELECT查询其中两个字段不匹配不起作用

时间:2019-05-29 21:15:07

标签: sql ms-access

我有一个VBA脚本,它通过一个表来查找,该表是两个不同表(ab)的联接,其中表(表)之间可能存在不匹配的字段a是原始表,表b是同一表,但是是新的导出文件)。

目标是找出哪些字段不同,并使用两个表(ab)之间不匹配的字段列表更新共享字段中的一个字段。

但是一个领域没有通过测试。我尝试单独查询该表,以查看是否可以使用简单的SQL查询来确定Access是否能够识别出差异。

我无法理解为什么它不起作用,就像我以相同的方式尝试其他字段一样,它返回了预期的结果。我已经确认两个字段都是Short Text数据类型,两个字段具有相同的“常规属性”,“查找属性”,并且“属性表”不仅在两个字段之间匹配,而且在所有其他相似的字段之间也匹配。

此查询:

SELECT [a_Address 2], [b_Address 2]
FROM Staging_LOG_ExportDifferences
WHERE ID = 18;

结果:

[a_Address 2] = (NULL)
[b_Address 2] = xasdf

但是当我尝试此查询时:

SELECT *
FROM Staging_LOG_ExportDifferences
WHERE [a_Address 2] <> [b_Address 2];

结果:

No results

3 个答案:

答案 0 :(得分:0)

这是NULL的语义。几乎每一次比较都会失败-或更准确地说,比较会返回NULL,并将其与FALSE一起过滤掉。

标准SQL具有NULL-安全比较,IS DISTINCT FROM。但是MS Access不支持。

因此,您可以明确地说:

SELECT *
FROM Staging_LOG_ExportDifferences
WHERE ([a_Address 2] <> [b_Address 2]) OR
      ([a_Address 2] IS NULL AND [b_Address 2] IS NOT NULL) OR
      ([a_Address 2] IS NOT NULL AND [b_Address 2] IS NULL) ;

答案 1 :(得分:0)

作为替代方案,您可以使用这种方法,从而避免在VBA中使用多个if语句:

SELECT [a_Address 2], [b_Address 2]
FROM Staging_LOG_ExportDifferences
WHERE Len(Nz([a_Address 2],"")) <> Len(Nz([b_Address 2],""))

答案 2 :(得分:0)

您可以使用此:

SELECT * 
FROM Staging_LOG_ExportDifferences
WHERE Nz([a_Address 2],'') <> Nz([b_Address 2],'');

这假设您的地址不包含空字符串,或者至少出于比较目的,您认为空字符串与NULL相等。我通常还会使用Trim来确保任何键入错误的空格都不会引起问题:

Trim(Nz([a_Address 2],'')) <> Trim(Nz([b_Address 2],''))