2

我的表table1有 3 个字段:FName, LName, Phone. 我正在使用 Microsoft Access 2010 运行 SQL 查询。有些行有空/空电话值。

我有一个接受搜索参数的 VB 表单。用户可以输入(FName and LName)(Phone),但不能同时输入两者。

当我尝试:

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*') ORDER BY table1.LName, table1.FName;

它给了我一个匹配给定 (FNameLName) 参数的用户列表。它工作正常。

同样,当我尝试:

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*') ORDER BY table1.LName, table1.FName;

它给了我一个匹配给定 ( Phone) 参数的用户列表。它也很好用。

但是,当我结合这两个查询时:

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*') AND table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*') ORDER BY table1.LName, table1.FName;

它没有给我预期的结果。

我什至尝试OR了 (FNameLName) 和 ( Phone) 搜索参数之间的条件。它不起作用。我已经尝试nz(frmSearchMain!Phone,"")了所有搜索参数,%而不是*,但到目前为止还没有运气。

我是 MS Access SQL 查询格式的新手。我在 MySQL 中多次使用这种类型的查询。但我无法从这个中得到预期的结果。

任何帮助,将不胜感激。

4

3 回答 3

0

在您的示例中,此查询给出匹配所有 3 个条件的记录的结果:

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*') AND table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*') ORDER BY table1.LName, table1.FName;

如果您想返回匹配 (Phone) OR (FName AND LName) 的记录,您必须这样做:

SELECT table1.LName, table1.FName, table1.Phone FROM table1
WHERE  (table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*'))
OR (table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*'))
ORDER BY table1.LName, table1.FName;

希望有帮助

于 2012-06-04T23:14:50.230 回答
0
sql = "SELECT LName, FName, Phone" & _
      "FROM table1" & _
      "WHERE (" & _
      "Phone LIKE ('%" & Forms!frmSearchMain!Phone & "%' )" & _
      "OR ( FName LIKE ('%" & Forms!frmSearchMain!FName & "%' )" & _
            "AND LName LIKE ('%" & Forms!frmSearchMain!LName & "%' ) )" & _
      "ORDER BY LName, FName"

运行该查询应返回具有正确名字和姓氏或正确电话(或两者)的所有 LName、FName、Phone。

注意:解释一下,老实说,我不知道如何正确连接那些多行 VBA 字符串。

于 2012-06-05T16:18:13.787 回答
0

我认为如果我们简化它应该更容易解决这个问题。所以我武断地决定暂时忽略LName,只根据FNameor进行搜索Phone

在我的版本中frmSearchMain,我将保存搜索目标值的文本框命名为FNameas,txtSearchFName因为我更喜欢以不同于记录源字段的方式命名控件。同样,我选择txtSearchPhonePhone搜索目标文本框。

由于我已经有一个名为 的表Table1,所以我tblKeerthiram改为调用我的表。

通过这些更改,此查询为我提供了匹配txtSearchFName或的行txtSearchPhone。如果两者txtSearchFNametxtSearchPhone为空,则查询将返回表中的所有行......这就是我希望你想要的。

SELECT
    t1.id,
    t1.FName,
    t1.Phone
FROM tblKeerthiram AS t1
WHERE
           (t1.FName Like "*"
               & [Forms]![frmSearchMain]![txtSearchFName]
               & "*"
        OR [Forms]![frmSearchMain]![txtSearchFName] Is Null)
    AND
           (t1.Phone Like "*"
               & [Forms]![frmSearchMain]![txtSearchPhone]
               & "*"
        OR [Forms]![frmSearchMain]![txtSearchPhone] Is Null)
ORDER BY t1.FName;

这种方法的结果是,如果两者txtSearchFNametxtSearchPhone都是非空的,则查询将只返回与两者都匹配的行。据我了解您的描述,这不是您想要的。您只想搜索一个或另一个,而不是同时搜索。

在这种情况下,我建议您使用两个搜索文本框的更新后事件来设置另一个 Null,当其中一个输入非 Null 值时。我不确定那句话有多清晰,所以只需将此代码添加到表单的模块中即可。它将确保两个文本框中只有一个包含非 Null 值。

Option Compare Database
Option Explicit

Private Sub txtSearchFName_AfterUpdate()
    If Not IsNull(Me.txtSearchFName) Then
        Me.txtSearchPhone = Null
    End If
End Sub

Private Sub txtSearchPhone_AfterUpdate()
    If Not IsNull(Me.txtSearchPhone) Then
        Me.txtSearchFName = Null
    End If
End Sub

最后,如果一切正常,那么你只需要修改它来处理LName. 希望这部分不会太令人生畏。祝你好运。

于 2012-06-05T18:55:37.597 回答