2014-12-08 88 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值,都不是。