如何在条件下正确使用AND / OR



我有一个这样的查询:

选择"AVG([DC].[合同金额]( AS [平均合同金额] ,MAX([DC].[合同金额]( AS [最大合同金额] ,MIN([DC].[合同金额]( 作为 [最小合同金额] 来自 [设计客户] 作为 [DC] 内部连接 [设计] 作为 [DC] 上的 [D]。[设计键] = [D]。[设计键] 内部连接 [任务] 作为 [D] 上的 [T]。[设计键] = [t]。[设计键] 内部联接 [项目设计] 作为 [PD] 在 [D] 上。[设计键] = [PD]。[设计键] 内部联接 [项目] 作为 [PD] 上的 [P]。[项目键] = [P].[项目键] 内部联接 [地址] 在 [A] 上作为 [A]。[地址指导] = [P].[项目指南] 其中 [DC]。[合约金额] != 0.00 和 [DC]。[客户密钥] = @CustomerKey 或 [A]。[区域键] = @RegionKey 或 [A]。[状态键] = @StateKey

出于某种原因,当我执行它[MinContractedAmount]返回0.00值时,它不关心我的 where 子句[DC].[ContractedAmount] != 0.00,为什么这不起作用?

注意[DC].[ContractedAmount]是一个货币字段

您需要对WHERE子句使用()AND因为运算符具有优先权,现在解释器可以理解这一点

WHERE ([DC].[ContractedAmount] != 0.00 AND [DC].[CustomerKey] = @CustomerKey)
OR [A].[RegionKey] = @RegionKey
OR [A].[StateKey] = @StateKey

你可能想要

WHERE [DC].[ContractedAmount] != 0.00 
AND ( [DC].[CustomerKey] = @CustomerKey
OR [A].[RegionKey] = @RegionKey
OR [A].[StateKey] = @StateKey )

您需要了解ANDOR的工作原理。

仅当TRUE所有相关条件时,才会AND结果TRUE

OR结果要TRUE即使只有涉及的条件之一TRUE

这解释了您注意到您的某个条件被忽略的行为。

退货TRUE

condition1 = TRUE AND condition2 = TRUE

退货TRUE:

condition1 = FALSE AND condition2 = FALSE OR condition3 = TRUE

解决方案:使用括号对哪些条件进行分组,您只需要TRUE1 个结果。

退货FALSE

(condition1 = TRUE OR condition2 = TRUE) AND condition3 = FALSE

如果我明白,你想要这个:

SELECT AVG(DC.ContractedAmount) AS AverageContractedAmount
,MAX(DC.ContractedAmount) AS MaxContractedAmount
,MIN(DC.ContractedAmount) AS MinContractedAmount
FROM DesignCustomer AS DC
WHERE DC.ContractedAmount <> 0 AND DC.CustomerKey = @CustomerKey
and exists
(
select * 
from Design AS D
INNER JOIN Task AS T ON D.DesignKey = t.DesignKey
INNER JOIN ProjectDesign AS PD ON D.DesignKey = PD.DesignKey
INNER JOIN Project AS P ON PD.ProjectKey = P.ProjectKey
INNER JOIN Address AS A ON A.AddressGuid = P.ProjectGuid and (A.RegionKey = @RegionKey or A.StateKey = @StateKey)
where DC.DesignKey = D.DesignKey
)

最新更新