在多个列中搜索

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 IfSelect...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看看它是否可以在其中一列中找到值,然后在另一列中找到值。似乎比我希望的要困难得多。

以上是关于在多个列中搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 的同一列中搜索多个单词

在多个列中搜索

在多个表的所有列中搜索的最简单方法? [复制]

如何在列中搜索多个字符串并更新单元格值?

Pandas str.contains - 在字符串中搜索多个值并在新列中打印值[重复]

数据表单独搜索多个列