在 SQL 世界裡 NULL 性質特殊,行為獨特,過去就曾討論過:
自以為至此對 NULL 認識已足,不料前兩天在 WHERE LIKE AND/OR 情境中遇上 NULL,一時意志動搖陷入迷惘,想必是認知還不夠深刻,再補篇 KB 吧!
先別急著看答案,大家猜猜以下 SQL 指令會得到什麼結果?
select'T1','MATCH'from dual wherenulllike'78'
union
select'T2','MATCH'from dual wherenot(nulllike'78')
union
select'T3','MATCH'from dual wherenot(nulllike'78') and 1 = 1
union
select'T4','MATCH'from dual wherenulllike'78'or 1 = 1
答案只有 T4 符合!
理由是 NULL 不管 LIKE 任何字串,結果不是 True 也不是 False,因此 T1 不成立;加上 NOT,一樣不是 True 也不是 False,故 T2 也不成立。這個無法論斷 True 或 False 的狀態與 1=1(True) 做 AND 運算結果不會成立,與 1=1 (True) 進行 OR 比較則會成立。
爬文找到專業解說,如下表所示,NULL LIKE 所產生既非 True 也不是 False 的狀態術語為 Unknown,Unknown AND True 為 Unknown(T3 的例子),Unknown AND False 為 False;Unknown OR True 為 True(T4 的例子),Unkown OR False 則為 Unknown。
未來遇 AND/OR 配 NULL 情境如信心動搖,速查此表堅定信念。