VB窗体和MS Access SQL通配符搜索
我的表格表格1有3个字段: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
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
都不为空,则查询将只返回与这两者匹配的行。我理解你的描述,那不是你想要的。