select 'true' from dual where 1 not in (null,1);
当我们执行这个这将导致什么如何做“的”条款在Oracle工作
什么我的问题是:
是上述查询在逻辑上等同于
select 'true' from dual where 1 != null and 1 != 1;
这将导致什么,就像上述说明
请澄清?
select 'true' from dual where 1 not in (null,1);
当我们执行这个这将导致什么如何做“的”条款在Oracle工作
什么我的问题是:
是上述查询在逻辑上等同于
select 'true' from dual where 1 != null and 1 != 1;
这将导致什么,就像上述说明
请澄清?
正确(但请注意,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,for'1 <> NULL => UNKNOWN' –
@ypercube非常感谢 – Maddy
是的,他们是。
select something from table where column not in (1,2,3);
相当于
select something from table where column != 1 and column != 2 and column != 3;
中陈述或语句的集合,同时也不是和语句的集合 - 但它也并不等于。
所以NOT IN等同于:
1 <> NULL
AND 1 <> 1
AND ...
虽然在将相当于:
1 = NULL
OR 1 = 1
OR ...
注意,集合中有NULL将无法正常工作,由于奇特的性质的NULL。
@这意味着当集合包含至少一个null而不是我们不能去的时候IN子句? – Maddy
我不知道你是如何传递值,但是对于NULL,你需要明确地拥有“AND A IS NOT NULL” –
是的。它是正确的。还应该将NULL值与IS NULL进行比较
您的脚本与NULL值进行比较的问题。你应该使用
column is null and column = 1
其实NULL是一个未定义的值。任何与NULL的比较既不是True也不是False,而是NULL。即使NULL = NULL
这就是为什么您的1不在(null,1)不起作用。
结果是'False',在这种情况下(因为在这个例子中有'1'列表)。 –
@ypercube你说得对:-)那是我的错。 –
是的,'NOT IN()'逻辑上等价于'!= AND!='链。 –
“IN()”的肯定条件相当于“OR =' –
”链条,您的列表中有NULL。由于NULL,NOT IN不会返回行。许多关于NOT IN和NOT EXISTS的讨论都显示了NULL的效果。 – tbone