Построение запроса из списка строк - PullRequest
0 голосов
/ 26 ноября 2008

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 ноября 2008

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

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")

С правильными индексами это должно превзойти список LIKE

0 голосов
/ 26 ноября 2008

Я бы использовал 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(")");
0 голосов
/ 26 ноября 2008

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

>>> 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%'"
...