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

时间:2013-04-20 12:12:13

标签: ms-access vb6 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]

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

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

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

2 个答案:

答案 0 :(得分:7)

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

查询处理器如何处理Null值可能确实因数据库引擎而异:它可以将Null解释为False,或者它可能只是忽略结果,或者它可能会触发错误。另请注意,如果...

,则null传播可能会将整个WHERE子句折叠为Null

(some other condition) AND (Null)

...评估为Null

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

答案 1 :(得分: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];