Я знаю, как использовать оператор LIKE и предложение WHERE для поиска указанного шаблона в столбце базы данных. например "SELECT * From customer WHERE nam like '%" & txts & "%'". если txts содержит "Мальчик". Отображаются записи с такими словами: «Мальчик в порядке», «что не так с мальчиком» и т. Д. Однако я хочу, чтобы если txts содержит «мальчик», он также должен отображать такие записи, как «там есть девочка и два мальчика», «менеджер пришел с мальчиком». Какой синтаксис / код я могу использовать для этого?

-1
yinkajewole 18 Авг 2020 в 10:35

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
0
yinkajewole 20 Авг 2020 в 16:39

Однако я хочу, чтобы если 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, которая отслеживает имя / идентификатор вашей реальной таблицы и обновляет ее с помощью триггеров, а затем вы можете запросить его так:

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()) способ работы

1
Caius Jard 19 Авг 2020 в 13:00