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

CJ7*_*CJ7 3 vb6 ms-access dao jet

在访问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]
Run Code Online (Sandbox Code Playgroud)

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

如果我引用Microsoft DAO 3.51 Object Library返回的记录集已超过100行.

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

Gor*_*son 7

WHERE ... [notes] = Null是非标准的SQL.空传播可能会强制任何涉及Null返回的表达式Null.因此,表达式[notes] = Null(您希望它是一个布尔表达式)可以很好地返回Null,这既不是也不TrueFalse.

查询处理器如何处理该Null值可能确实从一个数据库引擎到另一个数据库引擎不同:它可以解释NullFalse,或者它可以忽略结果,或者它可能触发错误.另请注意,null传播可能会将整个WHERE子句折叠为Nullif ...

(some other condition) AND (Null)

...评估为Null.

标准SQL将是([notes] IS NULL)和Jet/ACE等效的IsNull([notes]).这两个都将返回TrueFalse.