如何筛选包含列数据库中指定的所有单词的记录



我知道如何使用LIKE运算符和WHERE子句在数据库的列中搜索指定的模式。例如CCD_ 3。如果CCD_ 4包含"0";那个男孩;。它显示带有";这个男孩很好""这个男孩怎么了";,等然而,我想要的是,如果txts包含";男孩";,它还应该显示诸如";女孩和两个男孩在那里"经理带着一个男孩来了;。我可以使用什么语法/代码来实现这一点?

然而,我想要的是,如果txts包含"男孩";,它还应该显示诸如";女孩和两个男孩在那里"经理带着一个男孩来了;。我可以使用什么语法/代码来实现这一点?

类似于:

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%",但我也包含了一个如何使用参数化查询的示例。始终(始终(使用参数化查询。永远没有理由不使用它们。

SQL注入指南

SQL注入后果


现在我们已经澄清了问题,您可以继续修改此技术:

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, SQLiteType.Text, 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", SQLiteType.Text, search.Length, search)
Dim dt as New DataTable
sqlDa.Fill(dt)

请注意,默认情况下,System.Data.Sqlite似乎没有启用FTS(您可能会收到"no such module:fts5"错误(-MicrosoftData.Sqlte启用了FTS,但它没有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

最新更新