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值,或者返回多筆記錄,結果都正常。