查询结果未显示具有空值的记录

dlo*_*loh 3 ms-access ms-access-2010

我正在设计一个搜索表单,根据4个文本字段,Firstname,Surname,Phonenumber和Promo Code搜索我的访问数据库.

查询看起来像:

Like "*" & [Forms]![SearchF]![txtFirstName] & "*"
Like "*" & [Forms]![SearchF]![txtSurnameName] & "*"
Like "*" & [Forms]![SearchF]![txtPhone] & "*"
Like "*" & [Forms]![SearchF]![txtPromo] & "*"
Run Code Online (Sandbox Code Playgroud)

如果所有字段都为空,则搜索应返回所有记录.在文本框中输入一些值时,结果将缩小为匹配.

它几乎可以正常工作,但是当某些字段中没有值时会出现问题.例如,如果某人没有促销代码,那么即使您将其留空,也会始终跳过他们的记录.我假设访问查询不喜欢空白字段.

什么是解决这个问题的最简单方法?

Han*_*sUp 5

我认为文本框在这里可能有点分心,因为问题更基本.考虑这个查询......

SELECT f.id, f.some_text
FROM tblFoo AS f
WHERE f.some_text Like "*";
Run Code Online (Sandbox Code Playgroud)

它返回some_text包含任何非Null值的行,甚至是空字符串.但是它不会返回some_textNull的行.

原因是Like比较中的Null 永远不会评估为True.从立即窗口考虑这个例子......

? "foo" Like "*"
True
? Null Like "*"
Null
Run Code Online (Sandbox Code Playgroud)

对于您的Like比较,我认为您希望目标字段包含文本框文本的行.但是当文本框为Null时返回所有行.你可以通过将这两个条件结合起来做到这一点OR.

WHERE
    [Promo Code] Like "*" & Forms!SearchF!txtPromo & "*"
    OR
    Forms!SearchF!txtPromo Is Null
Run Code Online (Sandbox Code Playgroud)

当文本框为Null时,OR对于所有行,第二部分为true,因此返回所有行.

当文本框不是Null时,仅Like返回满足比较的那些行.