2016-11-16 70 views
1

我有一个表访问(简化)字段的性别,名字,姓氏和电话号码。在空白字段的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] & "*" 

,其中搜索是我的表单的名称,和标准的标准是个人的名字我的表单上的条目。

现在,如果我搜索性别F和姓氏史密斯,并将名字和姓氏字段留空,我希望能够查看“Alice Smith”和“Smithe”的记录。但是,我只拿到了“爱丽丝史密斯”的纪录。此外,如果我搜索性别F和电话号码111,我会得到Alice,Smithe和Eve的结果。同样,如果我只是单独搜索电话号码,我将获得全部五条记录。

我假设我在这里做错了什么,但我不知道它是什么。根据or的条件逻辑,结果应该是Null或111(对其他字段也是类似的),所以我猜它的行为和预期的一样。然而,我尝试过xor,并且我得到了相同的结果(即使它以我认为的方式工作,它看起来很糟糕,因为空白条目将被解释为null而不是“搜索每个条目”。我试过使用iif,它应该是正确的方法来做到这一点,但它放置在条件字段时似乎不起作用。我在这里丢失了什么?

回答

1

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

所以调整自己的标准接受该值""

+0

不喜欢*“&[Forms]![Search]![Criteria]&”*“'cover'”“''? 无论如何,在用'“”替换'Null'后,我仍然有同样的问题。 – tempguest

+0

Scratch that: 例如,如果我在姓氏字段中搜索“Smith”,我现在将拥有Alice和Charlie的记录,但是我不会有Smith的记录,这是我的问题之前有过。 – tempguest

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,如果相应的标准字段为空。

+0

什么是MySearchField1和MySearchField2? (我很新的访问。我一直在使用'Criteria'作为字段名称的占位符,所以我没有看到上面两个不同于'Criteria'。 这也意味着如果我有八个我需要7'和'? – tempguest

+0

我编辑了答案,现在应该更清楚了。'MySearchField *'是表字段名称,'Criteria *' - 文本框控件名称 –

+0

我会稍微尝试一下看看,要清楚,我会把它放在SQL视图中吗?我一直在使用设计视图,但SQL视图看起来真的很简单 – tempguest

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