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

问题描述

我知道如何使用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%",但我也提供了一个如何使用参数化查询的示例。始终(总是始终)使用参数化查询。从来没有(永远)没有理由使用它们。

SQL Injection guide

SQL Injection consequences


现在我们已经解决了问题,您可以继续对此技术进行修改:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...