【问题标题】:SELECT query where two fields do NOT match not working两个字段不匹配的 SELECT 查询不起作用
【发布时间】:2019-05-30 22:07:20
【问题描述】:

我有一个 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

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    这是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) ;
    

    【讨论】:

    • 这确定了问题。我很好奇,如何调整我的 VBA 部分代码来捕捉这些?现在我正在设置像这样CustAddress2A = exportDiffs.Fields("a_Address 2").Value这样的变量的值,然后像这样进行字符串比较:If StrComp(CustAddress1A, CustAddress1B, 1) &lt;&gt; 0 ThenResult = Result + "Address2; "Else: Result = ResultEnd If我如何确保我包含这些NULL解决方法?
    【解决方案2】:

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

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

    【讨论】:

    • 这将无法正常工作。如果两个地址不同但长度相同,则会导致误报。
    【解决方案3】:

    你可以用这个:

    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],''))
    

    【讨论】:

      猜你喜欢
      • 2023-01-22
      • 1970-01-01
      • 2019-06-14
      • 2017-10-06
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多