【问题标题】:Multi-field searches in Access with blank fieldsAccess 中带有空白字段的多字段搜索
【发布时间】:2016-11-16 22:54:55
【问题描述】:

我有一个访问表(简化),其中包含性别、名字、姓氏和电话号码的字段。

Sex     First    Last     Phone
F       Alice    Smith
M       Bob               111-111-1111
F                Smithe    111-111-1112
M       Charlie  Smith     
F       Eve      Drop      111-111-1113

我创建了一个表单以及一个查询来搜索记录,使用的条件是

Is Null Or Like "*" & [Forms]![Search]![Criteria] & "*"

其中 Search 是我的表单名称,Criteria 是我表单上各个条目的名称。

现在,如果我搜索 Sex F 和姓氏 Smith,并将名字和姓氏字段留空,我希望能够看到“Alice Smith”和“Smithe”的记录。但相反,我只得到“爱丽丝史密斯”的记录。此外,如果我搜索 Sex F 和电话号码 111,我会得到 Alice、Smithe 和 Eve 的结果。同样,如果我只搜索电话号码,我会得到所有 5 条记录。

我假设我在这里做错了什么,但我不知道是什么。基于 or 的条件逻辑,结果应该是 Null 或 111(其他字段类似),所以我猜它的行为符合预期。但是,我尝试了 xor,并且得到了相同的结果(即使它确实按照我认为的方式工作,但这似乎很糟糕,因为空白条目将被解释为 null 而不是“搜索每个条目”。我试过使用 iif,这应该是正确的方法,但是放在条件字段中时似乎不起作用。我在这里遗漏了什么吗?

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    Null 是特殊值(含义为not-known),它空白文本字段相同,其值为@987654323 @(空字符串)。

    因此调整您的标准以接受值""

    【讨论】:

    • Like "*" & [Forms]![Search]![Criteria] & "*" 不覆盖""?无论如何,在将Is Null 替换为"" 后,我似乎仍然遇到同样的问题。
    • 暂记一下:例如,如果我在姓氏字段中搜索 Smith,我现在会有 Alice 和 Charlie 的记录,但我不会有 Smith 的记录,这是我之前遇到的问题。
    【解决方案2】:

    对于每个字段的多字段搜索使用条件,如下所示:

    WHERE    
    ([Sex] Like "*" & [Forms]![Search]![CriteriaSex] & "*" 
        OR Nz([Forms]![Search]![CriteriaSex],"")="")
    AND ([First] Like "*" & [Forms]![Search]![CriteriaFirst] & "*" 
        OR Nz([Forms]![Search]![CriteriaLast],"")="")
    AND ([Last] Like "*" & [Forms]![Search]![CriteriaLast] & "*" 
        OR Nz([Forms]![Search]![CriteriaLast],"")="")
    AND ([Phone] Like "*" & [Forms]![Search]![CriteriaPhone] & "*" 
        OR Nz([Forms]![Search]![CriteriaPhone],"")="")
    

    在这种情况下,如果相应的条件字段为空,则每个条件都将为 TRUE。

    【讨论】:

    • MySearchField1MySearchField2 是什么? (我很陌生。我一直使用Criteria 作为字段名称的占位符,所以我看不出上面两个与Criteria 有何不同。这是否也意味着如果我有八个字段,我需要 7 个Ands?
    • 我编辑了答案,现在应该更清楚了。 MySearchField* 是表字段名称,Criteria* - 文本框控件名称
    • 我会尝试一下看看。为了清楚起见,我将把它放在 SQL 视图中?我使用设计视图已经有一段时间了,但是 SQL 视图确实看起来更简单。
    • 是的,对于这种情况,SQL 视图肯定要简单得多。如果将其转换为设计视图,它将看起来几乎无法阅读,尤其是如果您有其他条件
    【解决方案3】:

    构建此查询的另一种方法是根据填充的字段构建一个字符串。

    q = "SELECT * FROM table "
    w = ""
    IF(nz([Forms]![Search]![Criteria1],"")<> "") THEN
         w = "WHERE [table]![field] like '*" & [Forms]![Search]![Criteria1] & "*'"
    END IF
    IF(nz([Forms]![Search]![Criteria2],"")<> "") THEN
         IF (w="") THEN 
              w=" WHERE "
         ELSE 
              w=w & " AND "
         END
         w = w & " [table]![field] like '*" & [Forms]![Search]![Criteria2] & "*'"
    END IF
    IF(nz([Forms]![Search]![Criteria3],"")<> "") THEN
         IF (w="") THEN 
              w=" WHERE "
         ELSE 
              w=w & " AND "
         END
         w = w & " [table]![field] like '*" & [Forms]![Search]![Criteria3] & "*'"
    END IF
    q = q & w
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2013-12-12
      相关资源
      最近更新 更多