Построение запроса из списка строк
Как бы вы взяли произвольный список строк (в форме "%[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(")");