检查 Null 值时的结果不一致(Jet DAO 与 ACE DAO)

Posted

技术标签:

【中文标题】检查 Null 值时的结果不一致(Jet DAO 与 ACE DAO)【英文标题】:Inconsistent results when checking for Null values (Jet DAO vs. ACE DAO) 【发布时间】:2013-04-13 18:23:58 【问题描述】:

在访问 MDB 文件的 VB6 程序中,正在执行以下 SQL 查询:

> Select * FROM [table1] WHERE ([type] = 1 OR [type] = 2 OR [type] = 6)
> AND ([notes] = Null OR [notes] = '0') AND [date] >= 
> cvdate('09/03/2013') ORDER BY [date], [column2]

如果我在程序中引用Microsoft Access 14.0 Object Library,则返回的记录集有0 行。

如果我引用Microsoft DAO 3.51 Object Library,则返回的记录集有超过100 行。

造成这种差异的原因是什么?两个提供者处理Null 测试的方式有区别吗?这是 ACE DAO 访问旧 MDB 文件的重大更改吗?

【问题讨论】:

【参考方案1】:

WHERE ... [notes] = Null 是非标准 SQL。 Null propagation 可能会强制任何涉及Null 的表达式返回Null。因此,表达式[notes] = Null(您打算成为一个布尔表达式)很可能返回Null,它既不是True,也不是False

查询处理器处理Null 值的方式可能确实因一个数据库引擎而异:它可以将Null 解释为False,或者它可能只是忽略结果,或者它可能触发错误。另请注意,空传播可能会将您的整个 WHERE 子句折叠为 Null if...

(some other condition) AND (Null)

...计算为Null

标准 SQL 为 ([notes] IS NULL),Jet/ACE 等效为 IsNull([notes])。这两个都将始终返回TrueFalse

【讨论】:

【参考方案2】:

DAO 3.51 已经过时了。它在多年前被 DAO 3.6 取代。请改用 3.6,然后查看此版本的查询是否从 DAO 3.6 和 ACEDAO 返回相同的结果:

SELECT *
FROM [table1]
WHERE
        [type] IN (1,2,6)
    AND ([notes] Is Null OR [notes] = '0')
    AND [date] >= cvdate('09/03/2013')
ORDER BY [date], [column2];

【讨论】:

以上是关于检查 Null 值时的结果不一致(Jet DAO 与 ACE DAO)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis返回boolean值时数据库返回null

在检查空值时 onPostExecute 中的 AsyncTask 中的空指针异常

springboot+mybaties返回类型为Map,null值不显示问题

不一致的空等级检查scala 2.11.7

通过 RegQueryValueEx 和 RegGetValue 获取注册表值时的奇怪行为 [重复]

Room:如何检查行是不是存在