2014-10-31 160 views
0

我正在使用SQL Server 2008,当我执行一个左外连接到外表没有任何记录的表时,我是从我的where子句看到奇怪的行为。如果我检查我的外表中的值是否为'not null',则有时返回true。SQL:检查'值'不为空当'值'为空时返回TRUE

select * 
from foo f left join bar b on b.id=f.id 
where [email protected] and (f.status = 1 or b.Price is not null) 

当我f.status = 0b.Price不存在(或,出现在选择为空)这个查询选择记录,其中f.status = 0b.Price is null,即使(FALSE或FALSE)应该是假的。

如果我只是执行此查询,它会按预期工作,并且任何没有'bar'中的记录的任何内容都不会被选中。

select * 
from foo f left join bar b on b.id=f.id 
where [email protected] and b.Price is not null 

b.Price is not nullor操作的一部分似乎是造成问题的某些原因。这个查询有什么问题?我使用SQL Server 2012计算机上的类似数据运行相同的查询,但没有看到此问题,它是否与我正在使用的SQL Server版本有关?

回答

1

这两个公式是不是就像你发现的一样。

在第一个查询,price可以NULL的原因有两个:

  • 没有从left join比赛。
  • 有一根火柴b.Price为空

我强烈推荐第二种方法,把条件on子句。但是,如果你使用的第一个,作出比较在join使用的列:

where f.id = @id and (f.status = 1 or b.id is not null) 
1

你可以尝试的OUTER APPLY这样的:

SELECT * 
FROM foo f 
OUTER APPLY (
SELECT * 
FROM bar b 
WHERE f.id = b.id 
    AND (
     f.STATUS = 1 
     OR b.Price IS NOT NULL 
     ) b 
) 
WHERE f.id = @id 

而且我也建议使用列而不是*,不好的做法。外部应用有点像左连接,在这种情况下,它将过滤条形表中的所有数据,并将您只返回所需的数据。