SQL-поиск с логическими операторами - PullRequest
9 голосов
/ 01 декабря 2011

У меня есть веб-приложение asp.net, которому нужна страница поиска, которая ищет данные в определенной таблице (SQL). Сегодня это только простой запрос LIKE, использующий параметризованный sql:

SqlParameter[] param = new SqlParameter[1];

param[0] = new SqlParameter("@searchText", SqlDbType.VarChar);
param[0].Value = "%" + text + "%";

using (SqlDataReader dr = SqlHelper.ExecuteReader(this.ConnectionString, CommandType.StoredProcedure, "isp_Search", param))
{
       //Do something
}

Теперь мне нужно добавить опцию для использования логических операторов в поиске.

Таким образом, в текстовом поле пользователь может искать такие вещи, как

Adam OR Adams
James AND NOT Jame
Douglas AND (Adam OR Adams)

Добавление полнотекстовой индексации в таблицу не является предпочтительным вариантом, поскольку я не контролирую модель данных.

Я ищу способ интерпретации текстовых запросов и преобразования в оператор SQL с соответствующим числом SqlParams.

searchexpression = "Douglas AND (Adam OR Adams)"
MakeSearchQuery(searchexpression, out sqlquery, out SqlParam[] params)

Вернул бы что-то вроде

sqlquery = "SELECT someFields FROM table WHERE someField=@Param1 AND (someField=@Param2 OR someField=@Param3)"

И sqlParams, как

sqlParam[0] = 'Douglas'
sqlParam[1] = 'Adam'
sqlParam[2] = 'Adams'

Теперь должен быть кто-то, кто делал что-то подобное раньше? Я ищу как SO, так и Google без какого-либо реального успеха. Приветствуются указатели либо на открытый / свободный код, либо на хорошую идею о том, как преобразовать поисковое выражение в SQL.

1 Ответ

2 голосов
/ 01 декабря 2011

Синтаксический анализ запроса с помощью и / или / () и т. Д. Должен выполняться с помощью какого-либо синтаксического анализатора.Для чего-то такого простого, алгоритм shunting-yard должен хорошо работать (и именно так мы обрабатываем и / или / и т. Д. При фильтрации SE по тегам, хотя полная поддержка для скобокподвыражения доступны только внутри).Это создаст дерево операций, т. Е. (Здесь используется префиксное представление, но обычно оно используется для создания AST)

and("Douglas", or("adam", "adams"))

, которое затем необходимо использовать для создания TSQL.Не тривиально, но и не ракетостроение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...