2012-07-03 38 views
1
select 'true' from dual where 1 not in (null,1); 

当我们执行这个这将导致什么如何做“的”条款在Oracle工作

什么我的问题是:

是上述查询在逻辑上等同于

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

这将导致什么,就像上述说明

请澄清?

+2

是的,'NOT IN()'逻辑上等价于'!= AND!='链。 –

+2

“IN()”的肯定条件相当于“OR =' –

+3

”链条,您的列表中有NULL。由于NULL,NOT IN不会返回行。许多关于NOT IN和NOT EXISTS的讨论都显示了NULL的效果。 – tbone

回答

7

正确(但请注意,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(留作练习),并没有行会或者返回。

+0

+1,for'1 <> NULL => UNKNOWN' –

+0

@ypercube非常感谢 – Maddy

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; 
1

中陈述或语句的集合,同时也不是和语句的集合 - 但它也并不等于。

所以NOT IN等同于:

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

虽然在将相当于:

1 = NULL 
OR 1 = 1 
OR ... 

注意,集合中有NULL将无法正常工作,由于奇特的性质的NULL。

+0

@这意味着当集合包含至少一个null而不是我们不能去的时候IN子句? – Maddy

+1

我不知道你是如何传递值,但是对于NULL,你需要明确地拥有“AND A IS NOT NULL” –

0

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

4

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

column is null and column = 1 

其实NULL是一个未定义的值。任何与NULL的比较既不是True也不是False,而是NULL。即使NULL = NULL

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

+0

结果是'False',在这种情况下(因为在这个例子中有'1'列表)。 –

+0

@ypercube你说得对:-)那是我的错。 –