3

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

4

2 回答 2

7

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

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

(some other condition) AND (Null)

...评估为Null.

标准 SQL 将是([notes] IS NULL),Jet/ACE 等价物将是IsNull([notes]). 这两个都将始终返回Trueor False

于 2013-04-20T12:42:14.553 回答
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];
于 2013-10-16T17:10:32.493 回答