我的表 table1 有3个字段: FName
, LName
, {{1} } 即可。我正在使用Microsoft Access 2010来运行SQL查询。某些行具有空/空电话值。
我有一个接受搜索参数的VB表单。用户可以输入 Phone
或 (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 Access SQL查询格式的新手。我在MySQL中经常使用这种类型的查询。但是我无法从这个中得到预期的结果。
任何帮助都将不胜感激。
答案 0 :(得分: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;
如果要返回匹配(电话)或(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;
希望有所帮助
答案 1 :(得分: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字符串。
答案 2 :(得分:0)
如果我们简化它,我认为应该更容易对它进行排序。所以我现在任意决定忽略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。我不确定该句子有多清楚,所以只需将此代码添加到表单的模块中即可。它将确保两个文本框中只有一个包含非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
。希望这部分不会太令人生畏。祝你好运。