2013-12-17 277 views
0

我有一個存儲過程,它計算的文檔數不完整(1000)或取消(1100)。當我只有其中一個條件時,它會正確計數,但是一旦我添加了or,它就會忽略忽略任何邏輯的所有內容。必須有一些基本的東西我在這裏與SQL丟失SQL中的WHERE子句忽略OR

SELECT 
     [PartnerCoId] as DisplayID 
     ,[PartnerCompanyName] as DisplayName 
     ,Count(*) as DocumentTotal 
    FROM vwDocuments 
    where coid = @inputCoid and DocumentType = 'order' 
    and Status <> 1100 
    and PartnerCoId <> @inputCoid 
    group by 
     [PartnerCoId] 
     ,[PartnerCompanyName] 
union all 
SELECT [CoId] as DisplayID 
     ,[CompanyName] as DisplayName  
     ,Count(*) as DocumentTotal 
    FROM vwDocuments 
    where PartnerCoId = @inputCoid and DocumentType = 'order' 
    and Status <> 1100 
    and CoId <> @inputCoid 
    group by [CoId] 
     ,[CompanyName]    
    order by [DisplayName] 

這將返回未處於取消狀態的文件數。如果我將1100更改爲1000,則返回不完整狀態的文檔數量。一旦我將查詢更新爲:

and (Status <> 1100 or Status <> 1000) 

它打破了邏輯。

想法?我已經嘗試了很多不同的查詢邏輯組合,並且無法理清這一點。

+5

您是否嘗試將其更改爲AND?如果你想要所有的東西都不等於這兩者,它應該是AND。 –

回答

6

,而不是與布爾邏輯搏鬥,用not in

and Status not in (1100, 1000) 

它更容易閱讀和理解,因爲它實際上是英語,因爲這一切都在一個聲明中你不需要它周圍括號要麼。

+0

這是一個非常優雅的方式來做到這一點,謝謝你的洞察力。 –

4

如果我的理解正確,您希望Status既不是1100也不是1000

如果是這樣,那麼你就需要這樣的:

and (Status <> 1100 and Status <> 1000) 

如果使用or,那麼1100一個Status將通過測試,因爲它是<> 1000

+1

是的,它會是那樣的一天,謝謝 –

0

我認爲你的邏輯可能有點偏離。說(不完整或未取消)將返回所有文件,因爲所有行都符合此條件。

獲取狀態爲1100的文檔。這將在查詢中返回,因爲它在OR語句的一半處評估爲TRUE。

嘗試更換該行以

AND Status NOT IN (1000,1100) 

這應該只返回既不完成或取消的文件。希望這可以幫助!

0

讓我們簡化並思考你的邏輯。

DECLARE @i INT = 1; 

IF (@i <> 1 OR @i <> 2) 
    PRINT 'true'; 
ELSE 
    PRINT 'false'; 

您可以爲@i產生false值?我想不出一個。想想看:

  • 如果@i = 1,然後@i <> 1是假的,但@i <> 2是真實的。由於這些條件中只有一個對於整個條件是正確的,所以結果是正確的。
  • 如果@i = 2,則@i <> 1爲真,但@i <> 2爲假。由於這些條件中只有一個對於整個條件是正確的,所以結果是正確的。
  • 如果@i12之外的任何其他值,則兩個條件都成立。

至於其他的答案表明,解決這一問題的辦法是改變ORAND,或使用NOT IN(雖然我喜歡NOT IN少,因爲當你正在檢查一列,且列NULL能,the results surprise and confuse most people - 我更喜歡一貫地編程,而不是必須瞭解某些情況下可行的情況以及它確實沒有的情況)。