我有一個關於三元布爾邏輯的問題,它影響如何在我們的LINQ提供程序中實現多態實體之間的比較。用三元布爾邏輯比較SQL Server中的元組
在SQL中,如果你加入使用外鍵國家地區表:
SELECT * From Region r1, Region r2
WHERE r1.Country == r2.Country
(注:結果是相同的,你是否使用JOIN或WHERE synthax)
它將返回條件爲真的值,而不是條件爲假或未知(因爲某些鍵爲空)。因此,如果我們否定條件:
SELECT * From Region r1, Region r2
WHERE r1.Country != r2.Country
我們得到其中的條件爲真(今不同的密鑰)的值,我們將跳過具有相同鍵的,或者說有,因爲條件的一些空值的那些再次返回未知。即使我們這樣寫:
SELECT * From Region r1, Region r2
WHERE not(r1.Country == r2.Country)
未知將被傳播,所以空值不會出現在這個簡單的條件。到現在爲止還挺好。
現在讓我們想象一個地區可以有一個國家(小歐洲國家)或一個國家(美國,俄羅斯,中國......)。如果該地區有一個國家,它將有國家空白,反之亦然。
我們如何才能加入對[國家,國家],使其具有相同的屬性比以前?:
SELECT * From Region r1, Region r2
WHERE r1.Country == r2.Country OR r1.State == r2.State
如果它加入這個表達式將返回true,否則不明。我們希望,它僅在所有字段都爲空的情況下返回未知的,否則,如果我們否定:
SELECT * From Region r1, Region r2
WHERE not(r1.Country == r2.Country OR r1.State == r2.State)
它不返回行!如果我們嘗試更復雜的表達式:
SELECT * From Region r1, Region r2
WHERE (r1.Country == r2.Country AND r1.Country IS NOT NULL AND r2.Country IS NOT NULL)
OR (r1.State == r2.State AND r1.State IS NOT NULL AND r2.State IS NOT NULL)
然後它將在對匹配時返回true,否則返回false,並且從不爲空。然後,如果我們否定,它將返回所有行都爲空的值,其行爲與第一個示例中的行爲不同。
那麼用於比較這一對的表達式就像SQL平等一樣?
-
匹配
- 假時,當不匹配
- 未知當一些操作數爲null
- 真。
如果我這樣做,那麼我會將奧地利的地區(Id = 1的國家)與亞利桑那州(Id = 1的州)混合。我怎麼能讓他們不同? – Olmo 2011-04-22 09:32:52
這肯定會工作,非常感謝。我不會走你自己的路,因爲這是一個通用的解決方案,我可以比較任何實體集合中的任何實體集合,而且我不希望將模型與計算字段和索引混淆,以便進行每種可能的比較。無論如何,你應該得到一票。 – Olmo 2011-04-22 09:52:29
@Olmo:你可以在查詢中用它們的定義替換計算的字段:'ON CASE WHEN r1。... END = CASE WHEN r2。... END AND COALESCE(r1。...)= COALESCE(r2。...)',儘管它不可靠。請注意,使用「OR」解決方案時,比較次數將以二次方式增長。 – Quassnoi 2011-04-22 09:56:26