select 'true' from dual where 1 not in (null,1);
当我们执行这将不会产生任何结果
我的问题是:
上面的查询在逻辑上是否等价于
select 'true' from dual where 1 != null and 1 != 1;
这不会像上面的语句一样产生任何结果
请澄清?
select 'true' from dual where 1 not in (null,1);
当我们执行这将不会产生任何结果
我的问题是:
上面的查询在逻辑上是否等价于
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
(作为练习留下)并且也不会返回任何行。
您的脚本与 NULL 值比较的问题。你应该使用
column is null and column = 1
实际上 NULL 是一个未定义的值。任何与 NULL 的比较都不会给出 True 或 False,而是给出 NULL。甚至NULL = NULL
这就是为什么你的1 not in (null,1)不起作用的原因。
是的,他们是。
select something from table where column not in (1,2,3);
相当于
select something from table where column != 1 and column != 2 and column != 3;
IN 语句是 OR 语句的集合,而 NOT IN 是 AND 语句的集合 - 但它也不等于。
所以 NOT IN 等价于:
1 <> NULL
AND 1 <> 1
AND ...
而 IN 相当于:
1 = NULL
OR 1 = 1
OR ...
请注意,由于 NULL 的古怪性质,在集合中包含 NULL 将不起作用。
是的。它是正确的。NULL 值也应该与 IS NULL 进行比较