KB-當 WHERE AND/OR 條件遇上 NULL

在 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 情境如信心動搖,速查此表堅定信念。

歡迎推文分享:
Published 19 July 2017 11:04 PM 由 Jeffrey
Filed under: , ,
Views: 3,360



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<July 2017>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication