在访问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文件的重大变化吗?
答案 0 :(得分:7)
WHERE ... [notes] = Null
是非标准SQL。 Null propagation可能会强制任何涉及Null
的表达式返回Null
。因此,表达式[notes] = Null
(您希望它是一个布尔表达式)可以很好地返回Null
,它既不是True
也不是False
。
查询处理器如何处理Null
值可能确实因数据库引擎而异:它可以将Null
解释为False
,或者它可能只是忽略结果,或者它可能会触发错误。另请注意,如果...
Null
(some other condition) AND (Null)
...评估为Null
。
标准SQL为([notes] IS NULL)
,Jet / ACE等效为IsNull([notes])
。这两个都将始终返回True
或False
。
答案 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];