Я знаю, как использовать оператор LIKE
и предложение WHERE
для поиска указанного шаблона в столбце базы данных. например "SELECT * From customer WHERE nam like '%" & txts & "%'"
. если txts
содержит "Мальчик". Отображаются записи с такими словами: «Мальчик в порядке», «что не так с мальчиком» и т. Д. Однако я хочу, чтобы если txts
содержит «мальчик», он также должен отображать такие записи, как «там есть девочка и два мальчика», «менеджер пришел с мальчиком». Какой синтаксис / код я могу использовать для этого?
2 ответа
Вот как я это решил
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
Однако я хочу, чтобы если 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%"
, но я также включил пример того, как использовать параметризованные запросы. Всегда (всегда всегда) используйте параметризованные запросы. Нет (никогда) причины не использовать их.
Теперь, когда мы прояснили проблему, вы можете приступить к модификации этого метода:
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, которая отслеживает имя / идентификатор вашей реальной таблицы и обновляет ее с помощью триггеров, а затем вы можете запросить его так:
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») - Microsoft.Data.Sqlite имеет, но у него нет DataAdapter (так что вы возможно, придется переключиться на DataTable.Load(sqliteCommand.ExecuteReader())
способ работы
Новые вопросы
vb.net
Visual Basic.NET (VB.NET) - это мультипарадигмальный, управляемый, типобезопасный, объектно-ориентированный язык компьютерного программирования. Наряду с C # и F # это один из основных языков, нацеленных на .NET Framework. VB.NET можно рассматривать как эволюцию Microsoft Visual Basic 6 (VB6), но реализованную в Microsoft .NET Framework. НЕ ИСПОЛЬЗУЙТЕ этот тег для вопросов VB6, VBA или VBScript.