2015-05-01 73 views
-1

我有一个查询连接三个表并返回一个别名计算作为最后一个字段。当加入的字段中存在空值时,该值通常为空。加入效果很好。使用WHERE IS NULL返回所有值

我想只返回记录,我在计算字段中得到空值。

但是,如果我添加

WHERE field_name IS NULL 

到最后我没有得到任何记录

如果我添加

WHERE field_name IS NOT NULL 

我得到的一整套,我可以看到几个记录为事实null

任何解释为什么或如何解决这个问题?

编辑:我找到了我的情况的解决方案。字段名称是上面计算的别名。当我在where子句中复制计算时,不是放置别名,而是正确运行。

+6

你确定它们是实际的'NULL'而不是字符串''NULL''吗?您可能不得不展示更多的查询。 –

+1

我认为这会有助于我们看到你正在计算的连接和表达式。 – shawnt00

+2

哦。只是一个想法 - 你是否在你的'SELECT'子句中沿'a * b * field_value * c'的行作为field_value' - 即创建一个与现有列名称匹配的别名?因为如果是这样的话,请注意在''SELECT'之前运行'WHERE',所以它会过滤*列*,而不是你的计算值。 –

回答

0

,我发现我的情况的解决方案。字段名称是上面计算的别名。当我在where子句中复制计算时,不是放置别名,而是正确运行。

0

鉴于外部联接:

select * 
from table1 
left join table2 on table2.table1_id = table1.id 

的方式到is null过滤器适用于连接表是把它的连接条件:

select * 
from table1 
left join table2 on table2.table1_id = table1.id 
    and table2.col1 is null 

select * 
from table1 
left join table2 on table2.table1_id = table1.id 
where table2.col1 is null 

因为如果连接未命中,所有列S IN连接表是空的,因此使用在whereis null将返回连接到该行有一个空所有行未参加所有行。\