SQL中的WHERE子句忽略OR

时间:2013-12-17 15:43:12

标签: sql-server tsql

我有一个存储过程,用于计算我没有完成(1000)或取消(1100)的文档数。当我只有其中一个条件时,它会正确计算数字,但是一旦我添加了或者,它就会抓住所有忽略任何逻辑的东西。这里SQL必须有一些基本的东西

    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)

它破坏了逻辑。

思考?我已经尝试了很多不同的查询逻辑组合,但无法理顺它。

4 个答案:

答案 0 :(得分:6)

使用not in

,而不是与布尔逻辑搏斗
and Status not in (1100, 1000)

它更容易阅读和理解,因为它实际上是英语,并且因为它只是在一个声明中,你也不需要括号。

答案 1 :(得分:4)

如果我理解正确,您需要Status既不是1100也不是1000的所有内容。

如果是这样,那么你需要这个:

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

如果您使用or,则Status的{​​{1}}会通过测试,因为它是1100

答案 2 :(得分:0)

我认为你的逻辑可能有点偏差。说(不完整或未取消)将返回所有文档,因为所有行都符合此条件。

获取状态为1100的文档。这将在查询中返回,因为它在OR语句的一半上计算为TRUE。

尝试用

替换该行
AND Status NOT IN (1000,1100)

这应仅返回既未完成也未取消的文档。希望这有帮助!

答案 3 :(得分:0)

让我们简化并思考你的逻辑。

DECLARE @i INT = 1;

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

您能否为生成@i的{​​{1}}提供价值?我想不出一个。想一想:

  • 如果false,则@i = 1为false,但@i <> 1为真。由于只有其中一个条件必须为真,才能使整个条件成立,结果都是正确的。
  • 如果@i <> 2,则@i = 2为真,但@i <> 1为false。由于只有其中一个条件必须为真,才能使整个条件成立,结果都是正确的。
  • 如果@i <> 2@i1之外的任何其他值,则两个条件均为真。

正如其他答案所示,解决此问题的方法是将2更改为OR,或使用AND(尽管我更喜欢NOT IN因为当你是检查列,列NOT IN能够the results surprise and confuse most people - 而且我更喜欢一致地编程,而不是必须知道某些东西有效的情况以及它确实不存在的情况)。