为什么此访问查询有效,而其他访问无效?

时间:2019-11-22 09:39:47

标签: sql ms-access

我有一个查询,该查询基于表单(任务存档)上的布尔值进行过滤。布尔值以long形式存储在基础表中(仅允许使用0和-1)。

我想编写一个查询,该查询将只显示那些错误的记录(未归档的记录)或所有记录。

我希望下面的查询能够正常工作,但它不会...仅返回那些归档字段设置为True(-1)的记录:

SELECT tbl_Tasks.TaskID, tbl_Tasks.TArchive
FROM tbl_Tasks
WHERE (((tbl_Tasks.TArchive)=
    IIf([Forms]![frm_Activity]![txtArchivedTaskDisplay]=0,False,
    (tbl_Tasks.TArchive)=0 Or (tbl_Tasks.TArchive)=-1)));

下面的查询(我希望仅显示True的那些记录)实际上返回了所有记录:

SELECT tbl_Tasks.TaskID, tbl_Tasks.TArchive
FROM tbl_Tasks
WHERE (((tbl_Tasks.TArchive)=
    IIf([Forms]![frm_Activity]![txtArchivedTaskDisplay]=0,False,
    (tbl_Tasks.TArchive)<>0)));

这是为什么? 访问在这里遵循什么逻辑?

1 个答案:

答案 0 :(得分:1)

您不能将SQL放在IIF中的条件位置。如果可能,将评估IIF中的所有内容。由于您只有0或-1,因此评估始终为真。 ((tbl_Tasks.TArchive)=0 Or (tbl_Tasks.TArchive)=-1) => true

这就是为什么您只看到TArchive = true

您可以为第一个查询尝试类似的操作:

WHERE 
tbl_Tasks.TArchive **<** IIf(displayArchivedOnly,0,1);

第二个:

WHERE 
    tbl_Tasks.TArchive = [Forms]![frm_Activity]![txtArchivedTaskDisplay]

假设您的txtArchivedTaskDisplay拥有true或false值(如切换按钮)。但是再次,请阅读更多有关iif的工作原理。