2015-12-14 34 views
2

SQL服务器上的工作,我是想指望根据某些条件的总行数,如图波纹管的简单查询:SQL服务器上,运营商表现出不同的结果

SELECT count(*) FROM my_table WHERE (supp=92 OR (supp=94 and organisation <> 'LDF')) 

知道MY_TABLE不包含任何行与supp=92organisation='LDF'我决定把查询简单的像下面这样:

SELECT count(*) FROM my_table WHERE supp IN (92,94) and organisation <> 'LDF' 

两个查询的结果是完全不同的。

然而,查询看起来完全一样,我一直在试图找出问题出在哪里,但我找不到答案。

这真的让我感到困惑,先谢谢你的回答。

+1

考虑一个行,其中supp = 92 AND organization ='LDF'。它包含在第一个查询中,但从第二个查询中排除。 –

+1

也考虑一个行,其中supp = 92 AND organization IS NULL。它将包含在第一个查询中,但从第二个查询中排除。 – AHiggins

+0

谢谢你的回答,但是在supp_92和organization ='LDF'的行不存在于my_table上,这就是为什么这真是令人困惑 – PaxBin

回答

2

如果您organisation列包含的任何NULL值,其中supp=92,第一个查询将返回他们但第二个查询将排除他们。这是因为此代码:

organisation <> 'LDF' 

如果组织字段为NULL,将返回'NULL',而不是'TRUE'。

我建议你阅读罗伯特谢尔登关于NULL可以让你感动的所有方法的优秀文章;整篇文章值得一读,但the ninth point谈论这个特定的情况。

+0

就是这样,谢谢,我不知道运算符<>排除空值 – PaxBin

+0

乐意帮忙!我已经更新了我的答案,并附有一篇很好的文章链接,深入探讨了这个主题。 – AHiggins

0

他们是不一样的

第一:

SELECT COUNT(*) 
FROM my_table 
WHERE supp=92 
    OR (supp=94 AND organisation <> 'LDF') 

二是等价于:

SELECT COUNT(*) 
FROM my_table 
WHERE (supp = 92 OR supp = 94) 
    AND organisation <> 'LDF'