Ms access MS Access SQL-如何有条件地将条件设置为“全部”?

Ms access MS Access SQL-如何有条件地将条件设置为“全部”?,ms-access,Ms Access,我正在编制一份报告,向我展示每个班次的人员。我有一个带有组合框的表单,我可以在其中选择一个特定的班次,或者将其留空以显示所有班次。从组合框中选择一个值会将该文本镜像到一个隐藏的文本框,然后将该文本框传递给查询。现在,让报表按班次过滤是很容易的,现在让我头疼的是如何设置它,以便在我的班次过滤框为空时显示所有记录,就像WHERE子句为空时一样 以下是我的SQL代码: SELECT DISTINCTROW tblPersonnel.EmpID ,tblRank.Rank ,tblPer

我正在编制一份报告,向我展示每个班次的人员。我有一个带有组合框的表单,我可以在其中选择一个特定的班次,或者将其留空以显示所有班次。从组合框中选择一个值会将该文本镜像到一个隐藏的文本框,然后将该文本框传递给查询。现在,让报表按班次过滤是很容易的,现在让我头疼的是如何设置它,以便在我的班次过滤框为空时显示所有记录,就像WHERE子句为空时一样

以下是我的SQL代码:

SELECT DISTINCTROW tblPersonnel.EmpID
    ,tblRank.Rank
    ,tblPersonnel.NameStr
    ,tblPersonnel.Shop
    ,qryShiftRosterSub.Narrative
    ,qryShiftRosterSubShift.CurrentShift
    ,qryShiftRosterSubShift.ShopName
    ,tblRank.ID
FROM (
    (
        tblPersonnel LEFT JOIN qryShiftRosterSubShift ON tblPersonnel.EmpID = qryShiftRosterSubShift.EmpID
        ) LEFT JOIN tblRank ON tblPersonnel.Rank = tblRank.ID
    )
LEFT JOIN qryShiftRosterSub ON tblPersonnel.EmpID = qryShiftRosterSub.EmpID
WHERE (
        ((qryShiftRosterSubShift.CurrentShift) = IIf(Len([Forms] ! [frmNavMain] ! [NavigationSubform] ! [ShiftFilter]) = 0, 'Is Not Null', [Forms] ! [frmNavMain] ! [NavigationSubform] ! [ShiftFilter]))
        AND ((tblPersonnel.DeleteFlag) = False)
        );

我有几个链接在一起的查询,这是将完成的数据集发送到报表之前的最后一个查询。就像我说的,我可以很容易地让它显示一个特定的班次,通过清除CurrentShift中的条件,我可以让它显示所有记录,但是,如何根据我的筛选框中的内容在两者之间进行交换?

如果组合框不为空,为什么不附加SQL的“WHERE”部分?

如果组合框不为空,为什么不附加SQL的“WHERE”部分?

您可以尝试使用如下条件:

qryShiftRosterSubShift.CurrentShift = [Forms]![frmNavMain]![NavigationSubform]![ShiftFilter]
OR  Len(Nz([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter],""))= 0

您可以尝试使用如下条件:

qryShiftRosterSubShift.CurrentShift = [Forms]![frmNavMain]![NavigationSubform]![ShiftFilter]
OR  Len(Nz([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter],""))= 0

您只需添加一个
子句来检查组合框是否为空。请注意,您都需要考虑
空字符串和
Null
值。我更喜欢使用
Nz(MyComboBox)=''

实施:

选择DISTINCTROW tblPersonnel.EmpID
,tblRank.Rank
,tblPersonnel.NameStr
,tblPersonnel.Shop
,qryShiftRosterSub.叙述
,qryShiftRosterSubShift.CurrentShift
,qryShiftRosterSubShift.ShopName
,tblRank.ID
从(
(
tblPersonnel LEFT JOIN qryshiftersubshift ON tblPersonnel.EmpID=qryshiftersubshift.EmpID
)在tblPersonnel.Rank=tblRank.ID上左加入tblRank
)
在tblPersonnel.EmpID=qryShiftRosterSub.EmpID上左连接qryShiftRosterSub
在哪里(
((qryShiftRosterSubShift.CurrentShift)=IIf(Len([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])=0,'不为空',[Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])
或新西兰([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])=“”)
和((tblPersonnel.DeleteFlag)=False)
);

您只需添加一个
子句来检查组合框是否为空。请注意,您都需要考虑
空字符串和
Null
值。我更喜欢使用
Nz(MyComboBox)=''

实施:

选择DISTINCTROW tblPersonnel.EmpID
,tblRank.Rank
,tblPersonnel.NameStr
,tblPersonnel.Shop
,qryShiftRosterSub.叙述
,qryShiftRosterSubShift.CurrentShift
,qryShiftRosterSubShift.ShopName
,tblRank.ID
从(
(
tblPersonnel LEFT JOIN qryshiftersubshift ON tblPersonnel.EmpID=qryshiftersubshift.EmpID
)在tblPersonnel.Rank=tblRank.ID上左加入tblRank
)
在tblPersonnel.EmpID=qryShiftRosterSub.EmpID上左连接qryShiftRosterSub
在哪里(
((qryShiftRosterSubShift.CurrentShift)=IIf(Len([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])=0,'不为空',[Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])
或新西兰([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])=“”)
和((tblPersonnel.DeleteFlag)=False)
);

好的,用这个表达式建立起来,它的工作原理非常棒,但是它本质上是把Nz(…[ShiftFilter])=”当作一个通配符吗?我不太明白你所说的通配符到底是什么意思。这只是另一种情况。
((qryShiftRoste…=…ftFilter])
是真的,或者
Nz([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])=”)
是真的。好吧,用这种方式构建表达式,它的工作方式很棒,但它本质上是在处理Nz(…[ShiftFilter])=”作为通配符?我不太明白你所说的通配符是什么意思。这只是另一种情况。
((qryShiftRoste…=…ftFilter])
为真,或者
Nz([Forms]![frmNavMain]![NavigationSubform]![ShiftFilter])=”)
为真。