'in'子句如何在oracle中工作

Mad*_*ddy 6 sql sql-server oracle oracle10g

select 'true' from dual where 1 not in (null,1);
Run Code Online (Sandbox Code Playgroud)

当我们执行此操作时,什么都不会产生

我的问题是:

以上查询在逻辑上是等价的

select 'true' from dual where 1 != null and 1 != 1;
Run Code Online (Sandbox Code Playgroud)

这将不会像上述声明那样产生任何结果

请澄清?

ype*_*eᵀᴹ 9

正确(但请注意,这IN是一个运算符,而不是一个子句,它在SQL中的工作方式与此类似,不仅适用于Oracle).

where 1 not in (null,1)
Run Code Online (Sandbox Code Playgroud)

相当于:

where 1 != null and 1 != 1
Run Code Online (Sandbox Code Playgroud)

哪个应该写成:

WHERE 1 NOT IN (NULL, 1)
Run Code Online (Sandbox Code Playgroud)

WHERE 1 <> NULL AND 1 <> 1
Run Code Online (Sandbox Code Playgroud)

这与:

WHERE (1 <> NULL) AND (1 <> 1)
Run Code Online (Sandbox Code Playgroud)

其评估结果为:

WHERE UNKNOWN AND FALSE
Run Code Online (Sandbox Code Playgroud)

并进一步:

WHERE FALSE
Run Code Online (Sandbox Code Playgroud)

因此,它正确地返回没有行.


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