在 SQL 世界裡 NULL 性質特殊,行為獨特,過去就曾討論過:

自以為至此對 NULL 認識已足,不料前兩天在 WHERE LIKE AND/OR 情境中遇上 NULL,一時意志動搖陷入迷惘,想必是認知還不夠深刻,再補篇 KB 吧!

先別急著看答案,大家猜猜以下 SQL 指令會得到什麼結果?

select 'T1','MATCH' from dual where null like '78'
union
select 'T2','MATCH' from dual where not(null like '78')
union
select 'T3','MATCH' from dual where not(null like '78') and 1 = 1
union
select 'T4','MATCH' from dual where null like '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 情境如信心動搖,速查此表堅定信念。


Comments

Be the first to post a comment

Post a comment


91 - 20 =