Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите с парсингом строки  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
Здравствуйте,

направьте на путь решения задачи.. есть таблица

|   id   |   name      |
------------------------
| 1 | s1;s2;s3 |
| 2 | s4;s5 |
| 3 | s6 |
| 4 | s7;s8 |
------------------------

нужно получить такую

|   id   |   name      |
------------------------
| 1 | s1 |
| 1 | s2 |
| 1 | s3 |
| 2 | s4 |
| 2 | s5 |
| 3 | s6 |
| 4 | s7 |
| 4 | s8 |
------------------------

предполагаю, что нужно писать функцию, возвращающую таблицу, которая будет рекурсивно вытаскивать строки из поля..
9 июн 09, 12:32    [7280270]     Ответить | Цитировать Сообщить модератору
 Re: помогите с парсингом строки  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
9 июн 09, 12:36    [7280296]     Ответить | Цитировать Сообщить модератору
 Re: помогите с парсингом строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
temp-for-testing
Здравствуйте,

направьте на путь решения задачи.. есть таблица

|   id   |   name      |
------------------------
| 1 | s1;s2;s3 |
| 2 | s4;s5 |
| 3 | s6 |
| 4 | s7;s8 |
------------------------

нужно получить такую

|   id   |   name      |
------------------------
| 1 | s1 |
| 1 | s2 |
| 1 | s3 |
| 2 | s4 |
| 2 | s5 |
| 3 | s6 |
| 4 | s7 |
| 4 | s8 |
------------------------

предполагаю, что нужно писать функцию, возвращающую таблицу, которая будет рекурсивно вытаскивать строки из поля..
DECLARE @T TABLE(id INT,[name] VARCHAR(100));
INSERT @T(id,[name])
          SELECT 1,'s1;s2;s3'
UNION ALL SELECT 2,'s4;s5'
UNION ALL SELECT 3,'s6'
UNION ALL SELECT 4,'s7;s8';

DECLARE @Delimiters VARCHAR(100);
SET @Delimiters=' ;';

SELECT id, [name] FROM
(
 SELECT T.id, V.number, SUBSTRING(T.[name],V.number,
  (
   SELECT MIN(VV.number)
   FROM master.dbo.spt_values VV JOIN @T TT
   ON TT.id=T.id AND VV.type='P' AND VV.number BETWEEN V.number AND LEN(TT.[name])+1
   AND SUBSTRING(TT.[name]+LEFT(@Delimiters,1),VV.number,1) LIKE '['+@Delimiters+']'
  )-V.number
 )
 FROM @T T CROSS JOIN master.dbo.spt_values V
 WHERE V.type='P' AND V.number BETWEEN 1 AND LEN(T.[name])+1
 AND SUBSTRING(LEFT(@Delimiters,1)+T.[name],V.number,1) LIKE '['+@Delimiters+']'
)T(id,number,[name])
WHERE [name]>'';
9 июн 09, 12:51    [7280372]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить