select 'true' from dual where 1 not in (null,1);
当我们执行此操作时不会产生任何结果
我的问题是:
以上查询在逻辑上等同于
select 'true' from dual where 1 != null and 1 != 1;
这不会像上面的陈述那样产生任何结果
请澄清一下?
答案 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
进行比较