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

时间:2012-07-03 12:48:22

标签: sql sql-server oracle oracle10g

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

当我们执行此操作时不会产生任何结果

我的问题是:

以上查询在逻辑上等同于

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

这不会像上面的陈述那样产生任何结果

请澄清一下?

5 个答案:

答案 0 :(得分:9)

正确(但请注意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(左侧为练习),也不会返回任何行。

答案 1 :(得分:4)

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

column is null and column = 1

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

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

答案 2 :(得分: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;

答案 3 :(得分:1)

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

所以NOT IN相当于:

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

虽然IN等同于:

1 = NULL
OR 1 = 1
OR ...

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

答案 4 :(得分:0)

是。它是正确的。还应将NULL值与IS NULL

进行比较