SQL AND和OR逻辑错误
SQL AND and OR logic error
使用 MS Access 2016
非常卡在查询错误上。它仅使用 "Milestone" 标准或 "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
尝试使用 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] ) & ") ;
使用 MS Access 2016
非常卡在查询错误上。它仅使用 "Milestone" 标准或 "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
尝试使用 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] ) & ") ;