2014-10-31 162 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 

而且我也建議使用列而不是*,不好的做法。外部應用有點像左連接,在這種情況下,它將過濾條形表中的所有數據,並將您只返回所需的數據。