2013-04-20 33 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];