我的表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;
它给我的用户匹配给定(名单FName
和LName
)参数。 它工作正常。
同样的,当我尝试:
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
(间条件FName
和LName
)和( Phone
)搜索参数。 它不工作。 我曾尝试nz(frmSearchMain!Phone,"")
对所有的搜索参数,可以%
而不是*
,但至今没有运气。
我是新来的MS访问SQL查询的格式。 我已经使用这种类型的查询了很多次在MySQL。 但我不能从中得到一个预期的结果。
任何帮助,将不胜感激。
我认为它应该是更容易,如果我们把它简化到这一个梳理。 所以我擅自决定无视LName
现在,做仅基于搜索FName
或Phone
。
在我的版本的frmSearchMain
,我命名保存用于该搜索目标值的文本框FName
作为txtSearchFName
只是因为我喜欢不同于记录源字段名的控制。 同样,我选择txtSearchPhone
的Phone
搜索目标文本框。
因为我已经有一个表名为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值已进入其中的一个。 我不知道该如何清楚那句话是,所以才将此代码添加到您的窗体的模块。 这将确保只有两个文本框一个包含非空值。
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
。 希望这部分不会太艰巨。 祝好运。
在您的例子此查询给出匹配所有的三个条件,一个记录的结果:
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;
希望它能帮助
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参数,手机,它具有正确的姓和名,或正确的电话(或两者)。
注:套用的是,我真的不知道如何正确地串联那些多行VBA字符串。