检查 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])
。这两个都将始终返回True
或False
。
【讨论】:
【参考方案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)的主要内容,如果未能解决你的问题,请参考以下文章
在检查空值时 onPostExecute 中的 AsyncTask 中的空指针异常
springboot+mybaties返回类型为Map,null值不显示问题