不一致结果的空值(喷气DAO与ACE DAO)
问题描述:
在VB6程序访问一个MDB文件检查时,正在执行的以下SQL查询:不一致结果的空值(喷气DAO与ACE DAO)
> 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文件的重大改变吗?
答
WHERE ... [notes] = Null
是非标准的SQL。 Null propagation可能会强制涉及Null
的任何表达式返回Null
。因此,表达式[notes] = Null
(您打算成为布尔表达式)很可能会返回Null
,这既不是True
也不是False
。
查询处理器如何处理Null
值可能确实是从一个数据库引擎中都不同:它可以解释为Null
False
,或者它可能只是忽略的结果,也可能会引发错误。还要注意的是空的传播可能崩溃您的整个WHERE子句Null
如果...
(some other condition) AND (Null)
...评估为Null
。
标准SQL将为([notes] IS NULL)
,Jet/ACE等效为IsNull([notes])
。这两个将始终返回True
或False
。
答
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];