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

Откуда:
Сообщений: 58
Доброго дня.

Есть таблица с 2 полями:
id opisanie вида:
1 'различный текст (рост - размер) :2-3 года (92-98см)3 -4 года (98-104см)4-5 года (104-110см)5-6 лет (110-116см) и тут куча текста'
2 'различный текст (рост - размер) :12-13 лет (152-158см)13 -14 лет (158-164см)4-5 года...'
...

Нужно превратить вот в такое
id razmer
1 92-98
1 98-104
1 104-110
1 110-116
2 152-158
...

То есть берем только те скобки где есть символы "см" и разворачиваем их в столбец. Количество таких скобок в одной строке может быть от 0 до 10.
Делать через substring и patindex уж очень не хочется.
Чувствую нужно наверное как-то курсором это делать, но с ними никогда не имел дела. Помогите пж-та.
Заранее спасибо.
27 окт 17, 23:50    [20908179]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Если
Member

Откуда:
Сообщений: 58
автор
Делать через substring и patindex уж очень не хочется.

имел ввиду, что не хочется искать 1-ю скобку до 2-й скобки, потом 2-ю и до 3-й и т.д. Через substring и patindex будет просто огромная простыня кода.

Может есть какой-нибудь более элегантный способ?
28 окт 17, 00:03    [20908215]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1357
Если,

declare @t table (id int, val varchar(max))

insert into @t values (1, N'различный текст (рост - размер) :2-3 года (92-98см)3 -4 года (98-104см)4-5 года (104-110см)5-6 лет (110-116см) и тут куча текста'),
(2, N'различный текст (рост - размер) :12-13 лет (152-158см)13 -14 лет (158-164см)4-5 года...')

select * from @t

;with x (id, xdata) as (
select id,
       try_convert(xml, '<r>'+replace(replace(stuff([val], 1, charindex('(рост - размер)', [val])+15, ''), '(', '</r><r>'), ')', '</r><r>') + '</r>') as [xdata]
from @t
)
select x.id, replace(T.c.value('.', 'varchar(255)'), 'см', '') from x
cross apply x.xdata.nodes('/r[contains(., "см")]') T(c)
28 окт 17, 00:13    [20908251]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Если
Member

Откуда:
Сообщений: 58
felix_ff,

большое спасибо. Очень помогли.
28 окт 17, 21:27    [20909498]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить