習慣上我們在應用系統中一直使用兩值邏輯:非
true
即false
。兩值邏輯的運算體系已經相當成熟,與、或、非以及衍生的異或、與非等等。但是在實際應用中,我們會有機會遇到三值邏輯。
三值邏輯通常包含可選的
true
、false
、null
。如何在完備的兩值邏輯運算體系中加入這個
null
,使之滿足我們的需要,並且不會引發邏輯矛盾,就是我們要在這裡討論的。
null
參與邏輯運算時,實際上存在著不同的演算法。按
null
值在運算中的「優先順序」分為三種。
通常我們在資料庫中使用的三值邏輯,遵循
null
最優的原則。有
null
值參與二值運算時,返回結果為
null
,其它與二值邏輯相同。這一原則基於關係型資料庫將
null
視為「未知」。由於其內容未知,則任何邏輯值與之進行運算的結果都是未知(無意義值),這也與許多資料關係型資料庫對
null
的處理一致。
另一方面,可能有些朋友沒有注意到,事實上常見的許可權體系也是一種三值邏輯,這個體系裡
null
值處於最低優先順序,兩個許可權值進行合併時,
false
(否定)高於一切,沒有否定值時,肯定值(
true
)高於null
,只有兩個值均為
null
時,結果才為
null
。實際上我們可以將它看作是乙個三值與運算,那麼出於數學上的對稱,很容易可以構造出對應的邏輯或運算。這種運算規則視
null
為「未賦值」。
最後一種規定
null
值的優先順序介於
true
和false
之間,與運算,二者有一為
false
時,返回
false
,否則二者有一為
null
時,返回
null
,二者均為
true
時返回true
;或運算,二者有一為
true
時返回true
,否則二者有一為
null
時返回null
,二者均為
false
時返回false
。這等於分別承認
true
和false
在或和與運算中的最高優先順序。同樣它也是基於
null
值為「未知」的理念。但是在這種規則下,對
null
值嚴格視為未知的
true
或false
,而第一種規則則將其視為二值邏輯之外的乙個獨立存在。也有一些資料庫的三值邏輯是基於這個體系的,
msdn
中給出了乙個基於此規則的
dbbool
示例(用c#實現),我們在後面的討論中會基於該示例構造乙個更為全面實用的三值邏輯類。
關於null
值的學術討論其實一直沒有休止過,這期間還出現過四元邏輯等理論。實踐也證明,「真實」世界中客觀存在著不止一種三值邏輯體系。在實用中應當依據具體情況選擇最適合的規則。
SQL高階之三值邏輯與NULL
普通語言裡的布林型只有 true 和 false 兩個值,即二值邏輯 sql中有 true false 和 unknown,即三值邏輯 關係模型並不是描述現實世界的模型,而是描述人類認知狀態的核心 知識 的模型,我們有限且不完備的知識也會直接反映在表裡 三值邏輯優先順序 q 為什麼where co ...
討論值傳遞與引用傳遞
值傳遞 pass by value 是指在呼叫函式時將實際引數複製 乙份傳遞到函式中,這樣在函式中如果對 引數 進行修改,將不會影響到實際引數。public class test public static void test int y 輸出 10public class test public ...
討論 C Calendar賦初始值
q 我在page load的時候給calendar賦初始值,但是page顯示之後,calendar顯示是當天 比如今天顯示7月12號 我想讓它預設顯示出我給賦的時間 8 30 2006 我該怎麼去設定呢?a calendar1.selecteddate new datetime datetime.n...