我在表中有几个字段,我希望用户能够使用通配符进行搜索。我真正想要的是一种进行通配符搜索的方法,以促进公平的用户体验(例如,不笨重;速度不错;如果不快,那么可能在后台进行处理)。我知道通配符搜索是不受欢迎的;如果没有可行的解决方案,我甚至可能会废弃此功能。我想提一下,我正在寻找更多的想法,而不是寻找具体的代码。
这是一个示例,显示我到目前为止所尝试的内容。考虑这个假设表,其中3个字段包含文本(此表的目的无关紧要):
tableWidget
ID | Field1 | Field2 | Field3 |
1 | jimmy john | waldo johnson | carmen smith |
2 | francis | david smith | NULL |
3 | yvonne | harry t. | mr. waldo |
4 | dr. waldo, md | hal | NULL |
所以我想找到所有有" waldo"在里面。我的第一个预感是做这样的事情:
SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE ID IN
(
SELECT ID FROM tableWidget WHERE
Field1 LIKE '*waldo*' OR
Field2 LIKE '*waldo*' OR
Field3 LIKE '*waldo*'
)
这里的问题是,随着我正在运行的记录数量,它非常慢。我做的第二次尝试是这样的:
SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE ID IN
(
SELECT ID FROM tableWidget
WHERE Field1 & Field2 & Field3 LIKE '*waldo*'
)
这仍然很慢。我试过的第三种方法是让一个Form_Timer事件循环通过tableWidget并进行VBA比较。我的表单记录集是这样的:
SELECT * FORM tableWidget
WHERE ID IN (SELECT * FROM tempTable)
附加到磁带的代码片段看起来像这样"
With rsTableWidget
If Searching=True AND NOT .EOF Then
If INSTR(.Fields("Field1") & .Fields("Field2") & ".Fields("Field3"), "waldo") > 0 Then
rsTempTable.AddNew
rsTempTable.Fields("ID")=.Fields("ID")
rsTempTable.Update
mySubForm.Requery
End If
rsTableWidget.MoveNext
Else
Searching=False
rsTableWidget.Close: rsTempTable.Close
End If
End With
关于这一点的好处是它会在后台更新。关于这个的坏处是Form_Timer的每次迭代都会闪烁。当它找到一条记录时,mySubForm.requery方法会重置表单 - 不是非常用户友好。
我考虑过的其他方法是使用VBA代码定期解析每个单词(用空格分隔)并创建一个搜索表:
tableSearchTerm :
ID | searchTerm
1 | jimmy
1 | john
1 | waldo
1 | johnson
1 | carmen
1 | smith
2 | francis
2 | david
2 | smith
etc...
我还没有尝试过这个,但我想好的事情是我可以索引searchTerm。而且我不再需要使用通配符,因为所有条款都与ID相关联。不好的是,这张桌子会变得非常快!
有更好的方法吗?
答案 0 :(得分:1)
您的查询看起来过于复杂,为什么不使用它?
SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE
Field1 LIKE '*waldo*' OR
Field2 LIKE '*waldo*' OR
Field3 LIKE '*waldo*'
但是,在搜索字词的开头处使用通配符进行全文搜索会很慢,因为无法使用索引。
您可能希望将后端迁移到服务器数据库,具有全文搜索功能。例如。 SQL Server
此Q& A表示它也适用于Express版:Express with Advanced Services, can't create Full Text Index
如果这不是一个选项,我建议让用户选择
Field1 LIKE 'waldo*'
),如果您对字段编制索引会更快,或者这取决于您的数据。对于名称,例如,第一个选项几乎总是足够的。