2014-12-08 85 views
1

我不太明白...「不喜歡X」和「喜歡X」不總結?

有人請給我一個暗示,爲什麼查詢B + C的結果不會加起來給A嗎?

我首先想到的是,由於錯字,B和C之間的下劃線數量(應該是10)不匹配,但複製/粘貼後我有點無奈。 A的結果高於B + C的總和。

在聲明B和C中是否存在某種隱含的不同等,我不知道?

-- statement A 
select count(*) from mytable; 

-- statement B 
select count(*) from mytable where mycolumn like '__________'; 

-- statement C 
select count(*) from mytable where mycolumn not like '__________'; 
+3

該列中可能有NULL值 – 2014-12-08 09:24:41

+1

噢,夥計們,你太棒了! :)有一句德語說「Vor lauterBäumenden Wald nicht sehen」。謝謝!! – tschlein 2014-12-08 09:30:57

+0

總是被認爲是NULL值!如果你今天只學習1件事,這可能是學習的一件事,並永遠記住! – tvCa 2014-12-08 13:48:41

回答

7

如果mycolumn有某些行與NULL值,則這些將被排除在兩者LIKENOT LIKE條款。

因此,那些2條語句應該是平等的:

SELECT (select count(*) from mytable where mycolumn like '__________') 
+ (select count(*) from mytable where mycolumn not like '__________') 
+ (select count(*) from mytable where mycolumn IS NULL) 
FROM DUAL 

-- is equal to 

select count(*) from mytable; 
3

最有可能你的mycolumn包含NULL值。 NULL值不會與LIKE或NOT LIKE進行比較。

2

當您添加這樣的結果,它會積少成多:

select count(*) from mytable where mycolumn is null; 

這背後的原因是,null被認爲是「不確定」。所以你不能說什麼你不知道不像別的東西。它是未定義的。比較爲空,除非使用is null將始終返回false

1

您的列包含NULL值。當你比較什麼到NULL(甚至是另一個NULL)時,結果是false

所以在你的例子中,有那些像你的模式,那些不像你的模式和NULL值,都不是。