在Access中使用空白字段进行多字段搜索

时间:2016-11-16 22:54:55

标签: ms-access

我在访问(简化)中有一个表格,包括性别,名字,姓氏和电话号码。

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是我表单上各个条目的名称。

现在,如果我搜索性别F和姓氏史密斯,并将名字和姓氏字段留空,我希望能够看到" Alice Smith"和" Smithe"。但相反,我只得到了#34; Alice Smith"的记录。此外,如果我搜索性别F和电话号码111,我会得到Alice,Smithe和Eve的结果。同样,如果我只搜索电话号码,我将获得所有五个记录。

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

3 个答案:

答案 0 :(得分:1)

Null是特殊值(含义not-known), NOT 空白文本字段相同,后者具有值""(空字符串)。

因此请调整您的条件以接受值""

答案 1 :(得分:1)

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

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。

答案 2 :(得分:0)

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

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