Построение запроса из списка строк

Как бы вы взяли произвольный список строк (в форме "%[text]%") и столбец базы данных и превратили их в SQL-запрос, который выполняет LIKE сравнение для каждой строки в списке?

Пример: в моем списке три строки: "% bc%", "% def%" и "% ab%". Это строит запрос:

([ColumnName] LIKE "%bc" AND [ColumnName] LIKE "%def%") AND [ColumnName] LIKE "%ab%"

Пример A C# был бы превосходен, но не стесняйтесь писать на языке по вашему выбору.

3 ответа

Чтобы ответить на ваш вопрос напрямую,

string.join(" and ", 
    (new[] { "%bc%", "%def%", "%ab%" })
    .Select(x => string.Format("[{0}] LIKE '{1}'",columnName, x))
    .ToArray());

Чтобы решить вашу проблему, вы должны использовать средства полнотекстового поиска Sql Server. запрос будет:

select * from table
where FREETEXT("bc def ab")

С правильными индексами это должно превзойти список НРАВИТСЯ

Это просто строковое соединение на карте:

>>> los=['ab', 'cd', 'ef']
>>> ' and '.join(("somecolumn like '%%%s%%'" % s) for s in los)
"somecolumn like '%ab%' and somecolumn like '%cd%' and somecolumn like '%ef%'"

или же

>>> ' and '.join(("somecolumn like '%" + s + "%'") for s in los)
"somecolumn like '%ab%' and somecolumn like '%cd%' and somecolumn like '%ef%'"

Я бы использовал StringBuilder и цикл for. Предполагая, что ваш список называется "список" и является списком:


StringBuilder sql = new StringBuilder();
if (list.Count > 0)
    sql.AppendFormat(CultureInfo.InvariantCulture, "([{0}] LIKE \"{1}\"", columnName, list[0]);

for (int i = 1; i < list.Count; i++)
{
    sql.AppendFormat(CultureInfo.InvariantCulture, " AND [{0}] LIKE \"{1}\"", columnName, list[i]);
}

if (list.Count > 0)
    sql.Append(")");
Другие вопросы по тегам