今天啊苏问我一个问题:
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 产生的意外结果
本文探讨了一个关于SQL查询的有趣现象:当从表Z中查询x=1且x不在表Y中,或x存在于表Y时,为何查询结果为空。文章深入分析了数据库中的布尔值特性,特别是NULL值如何影响IN和NOT IN操作符的行为。

被折叠的 条评论
为什么被折叠?



