您好我在使用IN语句时遇到了一些问题。我举了一个例子来证明。
这是一个名为Person的表,其中initials是主键:
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 Person WHERE firstName NOT IN('Bill'); 我按预期得到了没有Bill的所有行。
但是,如果我写:
SELECT * FROM Person WHERE firstName NOT IN(NULL);
OR
SELECT * FROM Person WHERE firstName IN (NULL);
它告诉我什么,只是一个空集。有人可以向我解释原因吗?
因为我有一个表,我需要做这样的事情,它有NULL值,这是我的问题的一部分。
答案 0 :(得分:2)
使用谓词is not null
或is null
SELECT * FROM Person WHERE firstName is not null;
SELECT * FROM Person WHERE firstName is null;
如果您有其他条件,请使用or
子句:
SELECT * FROM Person WHERE firstName is null or firstName in('Bill');
答案 1 :(得分:2)
来自IN()运营商的文档:
expr IN (value,...)
...
为符合SQL标准,
IN
不仅返回NULL
左侧的表达式为NULL
,而且如果列表中未找到匹配项,则返回NULL
列表中的表达式是expr NOT IN (value,...)
。- 相同
expr IN (NULL)
这与NOT(expr IN(value,...))
这意味着,NULL
会产生FALSE
。在布尔上下文中,这是expr IN (NULL)
。这解释了为什么NOT(NULL)
没有给你任何结果。
此外,NOT(expr IN (NULL))
(如NULL
中)也会在布尔上下文中产生FALSE
(因此expr NOT IN (NULL)
。这解释了为什么{{1}}没有给你任何结果。
答案 2 :(得分:1)
正确的语法为IS NOT NULL
/ IS NULL
,因此请按以下方式进行更改
SELECT * FROM Person WHERE firstName IS NOT NULL;
OR
SELECT * FROM Person WHERE firstName IS NULL;
您可以阅读Documentation here
答案 3 :(得分: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);