我有一个存储过程,用于计算我没有完成(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)
它破坏了逻辑。
思考?我已经尝试了很多不同的查询逻辑组合,但无法理顺它。
答案 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
是@i
和1
之外的任何其他值,则两个条件均为真。正如其他答案所示,解决此问题的方法是将2
更改为OR
,或使用AND
(尽管我更喜欢NOT IN
因为当你是检查列,列NOT IN
能够the results surprise and confuse most people - 而且我更喜欢一致地编程,而不是必须知道某些东西有效的情况以及它确实不存在的情况)。