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

Откуда:
Сообщений: 3
Добрый день, столкнулся с такой проблемой:

есть строка ab/ac/ab/ac/ab, здесь / выполняет роль разделителя, он постоянный, по сути это несколько подстрок, разделенных слэшем, необходимо заменить 'а' на 'x', но при этом не затронув четные подсторки, в указанном примере получится xb/ac/xb/ac/xb, длина всей строки (кол-во подстрок) изначально неизвестна, ab может вполне быть и ba и ra и т. д. Вот ума не приложу как распарсить строку с известным разделителем.
11 ноя 13, 17:31    [15110671]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовании строки.  [new]
aleks2
Guest
CREATE function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
11 ноя 13, 17:34    [15110701]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовании строки.  [new]
e32m30
Member

Откуда:
Сообщений: 3
Направление понял, спасибо.

aleks2
CREATE function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
11 ноя 13, 17:42    [15110775]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовании строки.  [new]
Веrd
Member

Откуда: Лазаревское
Сообщений: 588
e32m30,
На скорою руку в голову пришёл только такой упоротый вариант:

1. Создаём временную таблицу с двумя полями: Value VARCHAR(50), OrderId INT
2. Организуем цикл WHILE: каждую итерацию от начала строки отрезаем кусок до "/", запихиваем этот кусок во временную таблицу, вместе с номером итерации
3. Делаем UPDATE временной таблицы с условием чётности строк (OrderId)

4. Склеиваем строки из таблицы в одну, примерно так:
SELECT @Val = ISNULL(@Val+ '/','') + Value 
FROM #T
--ORDER BY OrderId
13 ноя 13, 17:08    [15123317]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовании строки.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Веrd
4. Склеиваем строки из таблицы в одну, примерно так:
SELECT @Val = ISNULL(@Val+ '/','') + Value 
FROM #T
--ORDER BY OrderId

А чего ORDER BY закомментирован? Его потом раскомментировать надо, да?
13 ноя 13, 17:12    [15123368]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовании строки.  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
e32m30
Добрый день, столкнулся с такой проблемой:

есть строка ab/ac/ab/ac/ab, здесь / выполняет роль разделителя, он постоянный, по сути это несколько подстрок, разделенных слэшем, необходимо заменить 'а' на 'x', но при этом не затронув четные подсторки, в указанном примере получится xb/ac/xb/ac/xb, длина всей строки (кол-во подстрок) изначально неизвестна, ab может вполне быть и ba и ra и т. д. Вот ума не приложу как распарсить строку с известным разделителем.

версия сервера?
13 ноя 13, 17:35    [15123653]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовании строки.  [new]
e32m30
Member

Откуда:
Сообщений: 3
Версия 12. Я разобрался с проблемой, если кому надо - могу показать как.
29 ноя 13, 12:34    [15211281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить