2013-04-20 37 views
3

在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文件的重大改变吗?

回答

7

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

查询处理器如何处理Null值可能确实是从一个数据库引擎中都不同:它可以解释为NullFalse,或者它可能只是忽略的结果,也可能会引发错误。还要注意的是空的传播可能崩溃您的整个WHERE子句Null如果...

(some other condition) AND (Null)

...评估为Null

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

1

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];