为什么这个查询返回0行?MySQL mystery:空值与非空字符串没有区别
select t.f1, t.f2
from (select null f1, 'a' f2 from dual) t
where t.f1<>t.f2;
这是我有的复杂查询的蒸馏版本。我想比较包含一对一相关数据的两个表,我想选择那些包含特定字段不同值的行。但也可能出现这样的情况,其中一个表中缺少一行。 LEFT JOIN正确地为这些行返回空值,但是,WHERE子句不正确地(或意外)将这些行过滤掉。
为什么 - 在这种情况下 - 'null'是不是不同于任何非空值(如'a')?
什么让我发疯的是,这
select t.f1, t.f2
from (select null f1, 'a' f2 from dual) t;
返回1行(如我所料),但这
select t.f1, t.f2
from (select null f1, 'a' f2 from dual) t
where t.f1=t.f2;
返回0行! 所以null不等于'a',null与'a'不同!
请...有人可以解释这一点吗?
谢谢大家......是的,我已经通过向WHERE子句添加IS NULL条件解决了我的实际问题。然而,我很惊讶,'a'<> NULL和'a'= NULL都不能评估真实。 – tato 2010-08-04 11:17:48
我确切地知道你的意思,这是使用SQL的一个流血的逻辑窍门。 :) 即使经过多年的SQL工作,我总是必须在我的大脑中做额外的开关以允许NULL。 – 2013-08-29 03:26:29