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

Откуда:
Сообщений: 5
Добрый день!
Подскажите, пожалуйста, как написать запрос, чтобы заменить подстроку после 5-го вхождения символа запятой?
Т.е. есть строка: ааа, ббб, ввв, ггг, ддд, еее, жжж, ззз
Нужно определить из заменить все, после ддд, - т.е. запятая -5я а все буквенные символы всегда разные.
Спасибо!
27 ноя 17, 12:35    [20985482]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
Tepes
Member

Откуда:
Сообщений: 40
https://www.google.ru/search?q=t sql string functions&ie=utf-8&oe=utf-8&gws_rd=cr&dcr=0&ei=7OAbWuiPPJGQ6QTC3LCQBw
27 ноя 17, 12:55    [20985570]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
yongAdmin11
Member

Откуда:
Сообщений: 5
LEFT(str, CHARINDEX(',', str, CHARINDEX(',', str) + 1) - 1) - вот так получаю первые два символьные набора до второй запятой.
Уровень вложенности до 5-й пока не получается.
27 ноя 17, 13:02    [20985599]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
DECLARE @S VARCHAR(100)='ааа, ббб, ввв, ггг, ддд, еее, жжж, ззз';
SELECT @S;
WITH CTE(N,P) AS
(
 SELECT 1,CHARINDEX(',',@S)
 UNION ALL
 SELECT N+1,CHARINDEX(',',@S,P+1) FROM CTE WHERE N<5
)
SELECT TOP(1) STUFF(@S,1,P,'')
FROM CTE
ORDER BY N DESC;
27 ноя 17, 13:23    [20985705]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
yongAdmin11
Member

Откуда:
Сообщений: 5
iap, круто, работает, а как результат этого в переменную поместить ?
27 ноя 17, 14:31    [20985971]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
DECLARE @S VARCHAR(100)='ааа, ббб, ввв, ггг, ддд, еее, жжж, ззз';
SELECT @S;
WITH CTE(N,P) AS
(
 SELECT 1,CHARINDEX(',',@S)
 UNION ALL
 SELECT N+1,CHARINDEX(',',@S,P+1) FROM CTE WHERE N<5
)
SELECT TOP(1) @S=STUFF(@S,1,P,'')
FROM CTE
ORDER BY N DESC;

SELECT @S;
27 ноя 17, 14:32    [20985980]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
yongAdmin11
Member

Откуда:
Сообщений: 5
yongAdmin11, сорян ступил, все получилось.
Спасибо!
27 ноя 17, 14:39    [20986014]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
yongAdmin11
Member

Откуда:
Сообщений: 5
yongAdmin11, вернее, получается так, этот запрос берет все после 5 запятой, а как переделать под все что до этой 5-й запятой вывести?
27 ноя 17, 14:42    [20986026]     Ответить | Цитировать Сообщить модератору
 Re: Взять/заменить построку после n-го вхождения символа  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
yongAdmin11,

надо доработать для случаев, когда в строке меньше 5 запятых.
Например:
DECLARE @S VARCHAR(100)='ааа, ббб, ввв, ггг, ддд, еее, жжж, ззз';
SET @S ='ааа, ббб, ввв,';
SELECT @S;
DECLARE @NewS VARCHAR(100);
WITH CTE(N,P) AS
(
 SELECT 1,CHARINDEX(',',@S)
 UNION ALL
 SELECT N+1,CHARINDEX(',',@S,P+1) FROM CTE WHERE N<5 AND CHARINDEX(',',@S,P+1)>0
)
SELECT @NewS=STUFF(@S,1,P,'')
FROM CTE
WHERE N=5;

SELECT @NewS;
27 ноя 17, 14:49    [20986047]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить