VB窗体和MS Access SQL通配符搜索

VB窗体和MS Access SQL通配符搜索,sql,vba,wildcard,ms-access-2010,Sql,Vba,Wildcard,Ms Access 2010,我的表格表格1有3个字段:FName,LName,电话。我正在使用Microsoft Access 2010运行SQL查询。某些行具有空/空电话值 我有一个VB表单,它接受搜索参数。用户可以输入(FName和LName)或(电话),但不能同时输入两者 当我尝试时: 选择table1.LName、table1.FName、table1.Phone 来自表1 其中table1.LName-Like('*'&Forms!frmSearchMain!LName&'*')和table1.FName-Lik

我的表格表格1有3个字段:
FName
LName
电话
。我正在使用Microsoft Access 2010运行SQL查询。某些行具有空/空电话值

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

当我尝试时:

选择table1.LName、table1.FName、table1.Phone
来自表1
其中table1.LName-Like('*'&Forms!frmSearchMain!LName&'*')和table1.FName-Like('*'&Forms!frmSearchMain!FName&'*'))
按table1.LName、table1.FName排序

它提供了一个与给定(
FName
LName
)参数匹配的用户列表。它很好用

同样,当我尝试:

选择table1.LName、table1.FName、table1.Phone
来自表1
其中table1.Phone-Like(“*”&Forms!frmSearchMain!Phone&“*”)
按table1.LName、table1.FName排序

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

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

选择table1.LName、table1.FName、table1.Phone
来自表1
其中table1.Phone-Like('*'&Forms!frmSearchMain!Phone&'*')、table1.LName-Like('*'&Forms!frmSearchMain!LName&'*')和table1.FName-Like('*'&Forms!frmSearchMain!FName&'*'))
按table1.LName、table1.FName排序

它没有给我预期的结果

我甚至尝试了(
FName
LName
)和(
Phone
)搜索参数之间的
条件。它不起作用。我尝试了
nz(frmSearchMain!Phone,”)
来搜索所有的搜索参数,
%
而不是
*
,但到目前为止运气不好

我不熟悉MS Access SQL查询格式。我在MySQL中多次使用这种类型的查询。但我没能从这一次中得到预期的结果


如有任何帮助,我们将不胜感激。

在您的示例中,此查询将给出符合所有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;
如果要返回与(电话)或(FName和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;

希望对您有所帮助在您的示例中,此查询将给出符合所有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;
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"
如果要返回与(电话)或(FName和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;
希望能有所帮助

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或正确的Phone(或两者)

注意:我真的不知道如何正确连接这些多行VBA字符串

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


注意:请转述一下,我真的不知道如何正确连接这些多行VBA字符串。

我认为如果我们简化它,应该会更容易排序。所以我任意决定暂时忽略
LName
,只根据
FName
Phone
进行搜索

在我的
frmSearchMain
版本中,我将保存
FName
搜索目标值的文本框命名为
txtSearchFName
,这仅仅是因为我更喜欢以不同于记录源字段的方式命名控件。类似地,我为
Phone
搜索目标文本框选择了
txtSearchPhone

因为我已经有了一个名为
Table1
的表,所以我取而代之的是我的
tblKeerthiram

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

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;
这种方法的一个结果是,如果
txtSearchFName
txtSearchPhone
都不为空,则查询将只返回与这两者匹配的行。我理解你的描述,那不是你想要的。您希望只按一个或另一个进行搜索,而不是同时按两个进行搜索

在这种情况下,我建议您在两个搜索文本框中输入非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
。希望这一部分不会太令人畏惧。祝你好运。

我认为如果我们把它简化的话,这个问题应该会更容易解决。所以我任意决定暂时忽略
LName
,只根据
FName
Phone
进行搜索

在我的
frmSearchMain
版本中,我将保存
FName
搜索目标值的文本框命名为
txtSearchFName
,这仅仅是因为我更喜欢以不同于记录源字段的方式命名控件。类似地,我为
Phone
搜索目标文本框选择了
txtSearchPhone

因为我已经有了一个名为
Table1
的表,所以我取而代之的是我的
tblKeerthiram

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

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;
这种方法的一个结果是,如果
txtSearchFName
txtSearchPhone
都不为空,则查询将只返回与这两者匹配的行。我理解你的描述,那不是你想要的。