парсинг разделенных запятыми значений в MS-SQL (без csv или чего-то подобного) - PullRequest
0 голосов
/ 20 декабря 2010

Я использую коммерческое приложение с закрытым исходным кодом, которое использует базу данных MS-SQL.Мне регулярно приходится запрашивать эту базу данных самостоятельно для различных целей.Это означает, что дизайн таблицы и базы данных исправлен, и я ничего не могу с этим поделать.Я просто должен жить с этим.Теперь у меня есть две таблицы со следующими макетами (абстрагировано, чтобы не дискредитировать конструктор программного обеспечения / базы данных)

t1: ID (int), att1(varchar), att2(varchar), .... attx(varchar)

t2: ID (int), t1_ids(varchar)

Теперь содержимое этого t1_ids - это (дрожь) список разделенных запятыми идентификаторов t1.(например, 12, 456, 43, 675, 54).То, что я хочу сделать, - это (как вы уже догадались) соединить эти две таблицы.

К счастью для меня, это очень маленькие таблицы, и я вообще не беспокоюсь о производительности с точки зрения сложности (может быть O(n^m), насколько я забочусь).

В идеале я хотел бы сделать представление, объединяющее эти две таблицы.У меня нет никаких требований для вставки или обновления, только для отдельных утверждений.Какой самый простой и понятный (с точки зрения удобства обслуживания) способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Чтобы получить первое и последнее тоже используйте это:

select * 
from t1 
    join t2 on '%,' + t1.ID + ',%' like ',' + T2.t1_ids + ','

Не имеет значения, начинаются или заканчиваются T2.t1_ids. Допустимые значения заключены в запятые.

0 голосов
/ 20 декабря 2010

РЕДАКТИРОВАТЬ: после публикации этого ответа я понял, что функция PARSENAME может возвращать только одну часть проанализированной строки, так что это бесполезно, так как я думал, что это будет в вашей ситуации.

В поисках альтернативных решений я наткнулся на интересный ответ на этот вопрос: Разделить строку в SQL

Если вы можете добавить триггеры в свою базу данных, вы можете вызвать разделенную строку для INSERT, UPDATE и DELETE, чтобы поддерживать другую таблицу с идентификатором, разделенным в виде строк. Затем вы можете создать свой вид, используя эту таблицу.

Я знаю, вы сказали, что не обращаете внимания на скорость запроса, но, по крайней мере, таким образом вы не анализируете все строки каждый раз, когда запрашиваете данные.

...