今天啊苏问我一个问题:
select * from z where x=1;可以查询出结果
select * from z where x=1 and x not in (select x from y);
select * from z where x=1 and x in (select x from y);
都没有查询出结果(x是不存在于y表的), 百思不得其解。然后就为有找Google大神了
先讲一下数据库的bool值,原来分为TRUE、FALSE和UNKNOWN,则有 not TRUE=FALSE .而 not UNKNOWN=UNKNOWN。就是说在条件语句中UNKNOWN就是FALSE
而MSDN又说:
使用 IN 或 NOT IN 与 test_expression 比较后返回的所有空值都将返回 UNKNOWN。将空值与 IN 或 NOT IN 一起使用会产生意外结果。
是说一个值如果不存在于列表,但列表中存在null值。则返回一个UNKNOWN值,即FALSE 。null in (null)也是UNKNOWN.这就是NOT IN 产生的意外结果