SQL AND和OR逻辑错误

时间:2017-04-13 13:55:07

标签: sql ms-access boolean-logic

使用MS Access 2016

非常困在查询错误上。它只使用"里程碑"标准或" HierarchyLevel"标准 - 取决于最后更新的控件。状态标准适用于所有情况。

任何人都可以看到我的错误吗?查询应满足以下条件:选择状态,里程碑名称搜索字符串,所选级别或空级别(即所有级别)

谢天谢地

SELECT
qry_Milestones_WithHierarchy.ID, 
qry_Milestones_WithHierarchy.HierarchyLevel, 
qry_Milestones_WithHierarchy.Milestone 

FROM qry_Milestones_WithHierarchy 
WHERE 
    (  qry_Milestones_WithHierarchy.Milestone Like   "*" & [Forms]![frm_SelectMilestone]![txt_SearchTerm].[Text] & "*"  ) 
AND (  qry_Milestones_WithHierarchy.IDStatus               = [Forms]![frm_SelectMilestone]![cbo_Status]  )
AND 
(
       qry_Milestones_WithHierarchy.HierarchyLevel         = [Forms]![frm_SelectMilestone]![cbo_HierarchyLevel] 
 OR
       Len( [Forms]![frm_SelectMilestone]![cbo_HierarchyLevel].[Text] & "" ) = 0 
)
;

更新

日期示例

HierarchyLevel     Milestone
4                  NameTest1
4                  NameDemo1
3                  NameTest2
3                  NameDemo2

当我只使用里程碑或水平过滤器时,我得到了正确的结果

Controls 
TextBox(Milestone)        = ""
CombboBox(Status)         = 1
CombboBox(HierarchyLevel) = 4

Results
HierarchyLevel     Milestone
4                  NameTest1
4                  NameDemo1

第3级记录错误地包含在结果中

Controls 
TextBox(Milestone)        = "Test"
CombboBox(Status)         = 1
CombboBox(HierarchyLevel) = 4

Results
HierarchyLevel     Milestone
4                  NameTest1
3                  NameTest2

1 个答案:

答案 0 :(得分:0)

尝试使用IIf切换最后一个语句。请注意,在搜索开始时使用通配符会使字段上的索引变得多余,因此大数据集会使这种情况变得非常慢。

SELECT
qry_Milestones_WithHierarchy.ID, 
qry_Milestones_WithHierarchy.HierarchyLevel, 
qry_Milestones_WithHierarchy.Milestone 

FROM qry_Milestones_WithHierarchy 
WHERE ( qry_Milestones_WithHierarchy.Milestone Like   "*" & [Forms]![frm_SelectMilestone]![txt_SearchTerm] & "*"  ) 
AND ( qry_Milestones_WithHierarchy.IDStatus               = [Forms]![frm_SelectMilestone]![cbo_Status]  )
AND ( qry_Milestones_WithHierarchy.HierarchyLevel  " & IIF ([Forms]![frm_SelectMilestone]![cbo_HierarchyLevel] is null ,"Like *", " = " & [Forms]![frm_SelectMilestone]![cbo_HierarchyLevel] ) & ") ;