查詢條件為null時跑不出東西

select * from SOME_TABLE where colA <> ‘3’

上述條件會篩選出colA欄位不等於3的所有記錄。再比對下列語法:

select * from SOME_TABLE where colA <> null

此語法跑不出任何記錄,即使的確存在其他colA欄位非null的記錄。

實際要判斷某欄位是否為空值時,應用colA is null,判斷非空值時應使用colA is not null,而非使用=或<>或!=。

而如果某欄位的值要以子查詢來判斷時,通常是這麼寫的:

select * from SOME_TABLE where colA = (select colB from SOME_TABLE where colC=’eval’)

但子查詢不一定查得到colB,很可能返回null,此時就如同前述使用=比對欄位時,遇到null就完全比不出資料。就這個語法可能還看不出來差別,再看下一個例子:

select * from SOME_TABLE where colA != (select colB from SOME_TABLE where colC=’eval’)

這個語法是要找colA值不等於在colC值為’eval’時的colB值。假設SOME_TABLE的確存在很多記錄,但沒有一個colC欄位等於’eval’,此時子查詢會返回null時,結果導致主查詢查不到任何資訊,這與預想的結果有所落差。其次,如果colC=’eval’有多筆記錄,這個查詢就會出現錯誤。

此時如果將=改用in(),<>改用not in,例如:

select * from SOME_TABLE where colA  not in (select colB from SOME_TABLE where colC=’eval’)

無論子查詢返回null值,或者返回多筆記錄,結果都正常。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *