8
select 'true' from dual where 1 not in (null,1);

当我们执行这将不会产生任何结果

我的问题是:

上面的查询在逻辑上是否等价于

select 'true' from dual where 1 != null and 1 != 1;

这不会像上面的语句一样产生任何结果

请澄清?

4

5 回答 5

13

正确(但请注意,这IN是一个运算符,而不是一个子句,它通常在 SQL 中像这样工作,不仅适用于 Oracle)。

where 1 not in (null,1)

相当于:

where 1 != null and 1 != 1

这实际上应该写成:

WHERE 1 NOT IN (NULL, 1)

WHERE 1 <> NULL AND 1 <> 1

这与以下内容相同:

WHERE (1 <> NULL) AND (1 <> 1)

评估为:

WHERE UNKNOWN AND FALSE

并进一步作为:

WHERE FALSE

因此,它正确地不返回任何行。


请注意,如果您有WHERE 1 NOT IN (NULL, 2),它将评估为WHERE UNKNOWN(作为练习留下)并且也不会返回任何行。

于 2012-07-03T13:00:21.103 回答
4

您的脚本与 NULL 值比较的问题。你应该使用

column is null and column = 1

实际上 NULL 是一个未定义的值。任何与 NULL 的比较都不会给出 True 或 False,而是给出 NULL。甚至NULL = NULL

这就是为什么你的1 not in (null,1)不起作用的原因。

于 2012-07-03T12:56:11.403 回答
2

是的,他们是。

select something from table where column not in (1,2,3);

相当于

select something from table where column != 1 and column != 2 and column != 3;
于 2012-07-03T12:51:44.103 回答
1

IN 语句是 OR 语句的集合,而 NOT IN 是 AND 语句的集合 - 但它也不等于。

所以 NOT IN 等价于:

1 <> NULL
AND 1 <> 1
AND ...

而 IN 相当于:

1 = NULL
OR 1 = 1
OR ...

请注意,由于 NULL 的古怪性质,在集合中包含 NULL 将不起作用。

于 2012-07-03T12:52:48.707 回答
0

是的。它是正确的。NULL 值也应该与 IS NULL 进行比较

于 2012-07-03T12:53:11.490 回答