Sql 使用WHERE IS NULL返回所有值

Sql 使用WHERE IS NULL返回所有值,sql,sql-server,tsql,null,Sql,Sql Server,Tsql,Null,我有一个查询,它连接三个表并返回一个别名计算作为最终字段。当连接到的字段中存在null时,该值通常为null。连接效果很好 我只想返回计算字段中为空的记录 但如果我加上 WHERE field_name IS NULL 到最后我都没有记录 如果我加上 WHERE field_name IS NOT NULL 我得到了整个集合,我可以看到几个记录实际上是空的 有没有解释为什么或者如何解决这个问题 编辑:我为我的案例找到了解决方案。字段名是上述计算的别名。当我在where子句中复制计算时,它没有

我有一个查询,它连接三个表并返回一个别名计算作为最终字段。当连接到的字段中存在null时,该值通常为null。连接效果很好

我只想返回计算字段中为空的记录

但如果我加上

WHERE field_name IS NULL
到最后我都没有记录

如果我加上

WHERE field_name IS NOT NULL
我得到了整个集合,我可以看到几个记录实际上是空的

有没有解释为什么或者如何解决这个问题

编辑:我为我的案例找到了解决方案。字段名是上述计算的别名。当我在where子句中复制计算时,它没有放置别名,而是正确运行

给定外部联接:

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

因为如果联接未命中,则联接表中的所有列都为null,因此在
中使用
is null
,其中
将返回所有已联接到具有null的行的行和所有未联接的行。\

我找到了一个解决方案。字段名是上述计算的别名。当我在where子句中复制计算时,它没有放入别名,而是正确运行。

您确定它们是实际的
NULL
s,而不是字符串
'NULL'
?您可能需要显示更多的查询。我认为查看联接和您正在计算的表达式对我们很有帮助。哦。只是一个想法-您是否在
SELECT
子句中按照
a*b*field\u value*c as field\u value
的思路做了一些事情-也就是说,创建一个与现有列名匹配的别名?因为如果是这样,请注意,
WHERE
SELECT
之前运行,因此它将过滤列,而不是您的计算值。@Damien,我想您可能对最后一个建议有所了解。现在还不清楚OP所说的“我在我的字段中得到空值的位置”是什么意思。发布整个查询(或足以重现问题)后,是其他原因导致了意外的结果-
不是空的
正如您所期望的那样工作。