在多个列中搜索
Posted
技术标签:
【中文标题】在多个列中搜索【英文标题】:Searching in more than one column 【发布时间】:2016-09-09 16:19:59 【问题描述】:我有一个访问数据库,我在 VBA 和 ADODB 的帮助下从 excel 中搜索。
它工作得很好,但我一次只能搜索一件事。假设我想在列 [1] 中搜索“名字”的所有实例,并且在列 [2] 中也有“姓氏”。或者,列 [1] 中的“名字”和列 [3] 中的“地址”。
我将如何从用户窗体上的文本框中执行此操作?
我正在考虑以某种方式添加“名字+姓氏”或其他内容,但我无法弄清楚代码的逻辑。有什么建议吗?
这就是我现在所拥有的。
Private Sub cmd_lookup_Click()
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set sqlConnect = New ADODB.Connection
Set rs = CreateObject("ADODB.RecordSet")
sqlConnect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Source\database.accdb;Persist Security Info=False;"
cn.Open sqlConnect
rs.ActiveConnection = cn
SearchCriteria = "%" & searchCrit.Text & "%"
rs.Open "SELECT [1],[2] ,[3],[4], [5] FROM [tblDatabase]" & _
"WHERE [1] LIKE '" & SearchCriteria & "' " & _
" OR [2] LIKE '" & SearchCriteria & "' " & _
" OR [3] LIKE '" & SearchCriteria & "' " & _
" OR [4] LIKE '" & SearchCriteria & "' " & _
" OR [5] LIKE '" & SearchCriteria & "' " & _
"ORDER BY [2] Desc;", _
cn, adOpenStatic
Dim i As Integer
If Not rs.EOF Then
rs.MoveFirst
i = 0
With lstLookup
'Code not relevant
End With
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End If
End Sub
感谢您的建议:)
【问题讨论】:
有很多方法可以做到这一点。我倾向于使用用户表单让用户输入信息进行查询。然后,将这些输入保存为变量。它将需要一些条件逻辑(即If..End If
或Select...Case
)以省略任何空白。在不知道所需输出的情况下很难具体告诉您。
您可以动态构建您的 where 语句,包括在您想要同时找到两者时将 OR 切换为 AND。复杂之处在于识别何时是 AND 或 OR 等的 gui 和参数,但您可以使用下拉列表或复选框进行 AND/OR,然后在构建 SQL 语句时使用该值
表单上有多个输入框吗?例如,如果您有三个框,您可以让它们填写它们,然后您只需在带有这些值的查询上附加一个 AND
语句。如果框为空白,您可以插入通配符而不是空字符串。
我只有一个文本框,想保留它。
我想我会根据搜索条件中“+”号的数量将搜索字符串拆分为一个数组。然后我必须弄清楚如何同时在几列中搜索两个不同的条件。
【参考方案1】:
考虑由OR
运算符分隔的AND
配对。但首先要使用单独的文本字段构建用户表单(并且每个字段都必须是必填字段,否则您必须动态构建 WHERE
子句):
First Name Search:_____________
Last Name Search: _____________
Address Search: _______________
然后将条件绑定在一起。另外,出于调试原因,我不建议使用编号但命名的字段:
rs.Open "SELECT [1], [2], [3], [4], [5]" & _
" FROM [tblDatabase]" & _
" WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _
" AND [2] LIKE '%" & LastNameSearch & "%') " & _
" OR ([1] LIKE '%" & FirstNameSearch & "%' " & _
" AND [3] LIKE '%" & AddressSearch & "%') " & _
" OR ([2] LIKE '%" & LastNameSearch & "%' " & _
" AND [3] LIKE '%" & AddressSearch & "%') " & _
" ORDER BY [2] Desc;", _
cn, adOpenStatic
或者,在 SQL 世界中经常使用 UNION 查询,在UNION vs OR 之间讨论效率。为了真正等效,应在上面添加DISTINCT
以删除重复项。
rs.Open "SELECT [1], [2], [3], [4], [5]" & _
" FROM [tblDatabase]" & _
" WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _
" AND [2] LIKE '%" & LastNameSearch & "%') " & _
" UNION" _
" SELECT [1], [2], [3], [4], [5]" & _
" FROM [tblDatabase]" & _
" WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _
" AND [3] LIKE '%" & AddressSearch & "%') " & _
" UNION" _
" SELECT [1], [2], [3], [4], [5]" & _
" FROM [tblDatabase]" & _
" WHERE ([2] LIKE '%" & LastNameSearch & "%' " & _
" AND [3] LIKE '%" & AddressSearch & "%') " & _
" ORDER BY [2] Desc;", _
cn, adOpenStatic
【讨论】:
您好,感谢您的建议。我已经命名了列,我只是出于实用目的更改了这里的代码。我也只想使用一个文本框。我有超过 5 个要搜索的列(比如 25 个左右),它们是从日期到时间到名称和地址到组件名称等的所有内容。我只想能够编写“条件 1 + 条件 2”并拥有 SQL看看它是否可以在其中一列中找到值,然后在另一列中找到值。似乎比我希望的要困难得多。以上是关于在多个列中搜索的主要内容,如果未能解决你的问题,请参考以下文章