问题描述
我知道如何使用LIKE
运算符和WHERE
子句在数据库的列中搜索指定的模式。例如"SELECT * From customer WHERE nam like '%" & txts & "%'"
。
如果txts
包含“男孩”。它显示“男孩好”,“男孩怎么了”等记录。
但是,我想要的是,如果txts
包含“男孩”,它还应显示“女孩和两个男孩在那里”,“经理和男孩一起来”这样的记录。
我可以使用什么语法/代码来实现这一目标?
解决方法
但是,我想要的是,如果txt中包含“男孩”,它还应该显示“女孩和两个男孩在那里”,“经理和男孩一起来”这样的记录。我可以使用什么语法/代码来实现这一目标?
类似的东西:
Dim search = "the boy"
search = "%" & search.Replace(" ","%") & "%"
Dim sqlDa = New SQLiteDataAdapter("SELECT * From customer WHERE nam like :n","your connection string here")
sqlDa.SelectCommand.Parameters.Add("n",SQLiteType.Text,search.Length,search)
Dim dt as New DataTable
sqlDa.Fill(dt)
关键部分是将搜索词从"the boy"
修改为"%the%boy%"
,但我也提供了一个如何使用参数化查询的示例。始终(总是始终)使用参数化查询。从来没有(永远)没有理由使用它们。
现在我们已经解决了问题,您可以继续对此技术进行修改:
Dim search = "the boy"
Dim sqlDa = New SQLiteDataAdapter("SELECT * From customer WHERE 1=1 ","your connection string here")
Dim terms = search.Split()
For i = 0 to UBound(terms)
Dim term = terms(i)
sqlDA.SelectCommand.CommandText &= $" AND name LIKE :n{i}"
sqlDa.SelectCommand.Parameters.Add("n" & i,term.Length + 2,"%" & term & "%")
Next i
Dim dt as New DataTable
sqlDa.Fill(dt)
它只是构建一个SQL,如:
SELECT * From customer WHERE 1=1 AND nam LIKE :n0 AND nam LIKE :n1
'n0 = %the%
'n1 = %boy%
或者我们可以使用全文搜索;设置并保持最新状态比较麻烦(请看一下https://hackernoon.com/sqlite-the-unknown-feature-edfa73a6f022之类的东西)-您基本上创建了一个FTS5虚拟表来跟踪您的真实表nam / id并保持最新使用触发器,那么您可以像这样查询它:
Dim search = "the boy"
Dim sqlDa = New SQLiteDataAdapter("SELECT * From customer JOIN fts_customer ON customer.id = fts_customer.id WHERE fts_customer.nam MATCH :s"
sqlDa.SelectCommand.Parameters.Add("s",search)
Dim dt as New DataTable
sqlDa.Fill(dt)
请注意,默认情况下,System.Data.Sqlite似乎没有启用FTS(您可能会收到“没有此类模块:fts5”错误)-Microsoft.Data.Sqlite确实有,但没有DataAdapter (因此您可能需要切换到DataTable.Load(sqliteCommand.ExecuteReader())
工作方式
这就是我的解决方法
Dim search = "the boy"
Using sqlconn As New SQLiteConnection(connectionString)
Dim readN As String = "SELECT id From customer WHERE 1=1 "
Dim cmd As New SQLiteCommand(readN,sqlconn)
Dim terms = search.Split()
For i = 0 To UBound(terms)
Dim term = terms(i)
cmd.CommandText &= $" AND name LIKE :n{i}"
cmd.Parameters.AddWithValue(":n" & i,"%" & term & "%")
Next i
sqlconn.Open()
Dim reader As SQLiteDataReader = cmd.ExecuteReader
While reader.Read
For i = 0 To reader.FieldCount - 1
MsgBox(reader.GetValue(i))
Next
End While
sqlconn.Close()
End Using