VB表单和MS Access SQL通配符搜索

时间:2012-06-04 22:45:23

标签: sql vba wildcard ms-access-2010

我的表 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中经常使用这种类型的查询。但是我无法从这个中得到预期的结果。

任何帮助都将不胜感激。

3 个答案:

答案 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,并仅根据FNamePhone进行搜索。

在我的frmSearchMain版本中,我将文本框命名为FName的搜索目标值为txtSearchFName,因为我更喜欢将控件命名为与记录源字段不同。同样,我为txtSearchPhone搜索目标文本框选择了Phone

由于我已经有一个名为Table1的表,我改为调用我的tblKeerthiram

通过这些更改,此查询为我提供了与txtSearchFNametxtSearchPhone匹配的行。如果txtSearchFNametxtSearchPhone都为空,则查询将返回表中的所有行...这是我希望您想要的。

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;

这种方法的结果是,如果txtSearchFNametxtSearchPhone都是非空的,则查询将仅返回与两者匹配的行。据我了解你的描述,这不是你想要的。您只想搜索其中一个,而不是同时搜索两个。

在这种情况下,我建议你使用两个搜索文本框的更新后事件,在其中一个非空值输入时设置另一个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。希望这部分不会太令人生畏。祝你好运。