2014-02-23 65 views
0

您好我在使用IN语句一个小问题。我举了一个例子来演示。MySQL的:使用IN子句

这里有一个名为Person表,其中缩写是主键:

initials  firstName  surname  age 
-------------------------------------------------- 
    BT   Bill  Thomson  15 
    JS   Jack   Smith  10 
    KM   Katie  Miller  2 
    KW   Keiran  Williams  18 
    LB   Lauren  Bell   6 
    LS   Lucy  Stevens  7 

所以,如果我有这样的查询: SELECT * FROM WHERE人的firstName NOT IN( '法案'); 我按预期得到没有Bill的所有行。

但是,如果我写的:

SELECT * FROM Person WHERE firstName NOT IN(NULL); 

OR

SELECT * FROM Person WHERE firstName IN (NULL); 

它告诉我没什么,只是一个空集。有人可以向我解释为什么? 因为我有一个表,我需要做这样的事情,它有NULL值,这是我的问题的一部分。

+2

与'NULL'的任何比较 - 'IS NULL'除外 - 返回false或NULL(将其视为false) 。这适用于'in'和'not in'以及其他比较操作。 –

+0

我有点理解你在说什么...但是如果我们拿firstName,它有{Bill},如果我们将它与{NULL}进行比较,使用{Bill} IN {NULL},那么我明白为什么这是错误的。 我不明白为什么{Bill}不在{NULL}是错误的? – tenkii

回答

1

你似乎在寻找一些直觉而不是规则。

NULL的关键方面是它并不意味着“哦,我有一个值等于NULL的东西”。不,这意味着:“我有一个未知的价值”。

所以,当你说:你是说

SELECT * FROM Person WHERE firstName NOT IN (NULL); 

:是firstName不是由一个未知值的值的列表?那么,SQL不知道。该值是未知的。它可能firstname相同。它可能是different。所以,结果是NULL。请注意,当列表中有其他不匹配的值时,这将返回NULL(基本上等于false)。当匹配值在列表中时它将返回false。

当你说:

SELECT * FROM Person WHERE firstName IN (NULL); 

的逻辑几乎是相同的。 “firstName在由未知值组成的值列表中吗?”那么,SQL不知道,所以结果是NULL。请注意,当列表中有其他不匹配的值时,这将返回NULL(基本上等于false)。当匹配值位于列表中时,它将返回true,如下所示:

SELECT * FROM Person WHERE firstName IN (firstname, NULL); 
+0

感谢这个解释真的解决了问题。 – tenkii

2

使用谓词is not nullis null

SELECT * FROM Person WHERE firstName is not null; 

SELECT * FROM Person WHERE firstName is null; 

如果您有其他condtions使用or条款:

SELECT * FROM Person WHERE firstName is null or firstName in('Bill'); 
1

正确的语法是IS NOT NULL/IS NULL所以更改如下

SELECT * FROM Person WHERE firstName IS NOT NULL; 

SELECT * FROM Person WHERE firstName IS NULL; 

您可以阅读Documentation here

2

IN()运营商的文档:

  • expr IN (value,...)

    ...

    为了符合SQL标准,IN回报NULL不仅如果在左侧的表达式是NULL,而且如果找不到匹配在列表中找到并在列表中的表现之一是NULL

  • expr NOT IN (value,...)

    这是相同的为NOT(表达式IN(值,...))

这意味着,expr IN (NULL)产量NULL。在布尔上下文中,这是FALSE。这解释了为什么expr IN (NULL)不给你任何结果。

另外,NOT(NULL)(与在NOT(expr IN (NULL))中一样)也产生NULL(因此在布尔上下文中为FALSE)。这解释了为什么expr NOT IN (NULL)不会给你任何结果。