Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Neumexa Member Откуда: Сообщений: 202 |
как легче разбить запись ул. Тестовая 1,2,3,4,5,6,7 на ул. Тестовая 1 ул. Тестовая 2 ул. Тестовая 3 ул. Тестовая 4 и т.д.? |
23 авг 12, 17:37 [13056724] Ответить | Цитировать Сообщить модератору |
dvim Member Откуда: Санкт Петербург Сообщений: 684 |
create table # (id varchar(100)) select id into #t from dbo.f_GetCommaListAsTable ('20,30,70 ,100 ') далее уже из временной таблицы можно селектить в нужном вам формате. select (select top 1 str(ID) from #t) + ' ,' + str(id) from #t where id <> (select top 1 str(ID) from #t) Может не совсем оптимально - но работоспособно. текст функции: ALTER Function [dbo].[f_GetCommaListAsTableStrings] (@CommaLimitedList varchar(max)) RETURNS @Result TABLE (id varchar (50)) as Begin declare @CommList1 varchar (max) declare @Pos as int declare @tResult table(ID varchar (50)) set @CommList1 = LTrim(rTrim(@CommaLimitedList)) set @CommList1 = @CommList1 + ' ,' WHILE patindex ('%,%',@CommList1 )> 0 BEGIN set @Pos = patindex ('%,%',@CommList1 ) insert @tResult select (left(@CommList1, @pos -1 ) ) set @CommList1 = right (@CommList1 ,len(@CommList1)- @pos ) end /* при передаче пустого списка остается одна запись 0 ее удаляем */ delete from @tResult where id is null or id = '' insert @Result select rtrim ( Ltrim(id)) from @tResult return end |
23 авг 12, 18:01 [13056893] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
;with cte as (select xz1, cast('<a>'+replace(xz2,',','</a><a>')+'</a>' as xml) as xz2 from @t) select xz1, [val] from cte t1 cross apply (select t.c.value('text()[1]', 'varchar(10)') as [val] from t1.xz2.nodes('/a') as t(c))as t2 xz1 val -------------------------------------------------- ---------- ул. Тестовая 1 ул. Тестовая 2 ул. Тестовая 3 ул. Тестовая 4 ул. Тестовая 5 ул. Тестовая 6 ул. Тестовая 7 |
23 авг 12, 18:52 [13057144] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
declare @t table (s nvarchar(100)); insert into @t values (N'ул. Тестовая 1,2,3,4,5,6,7'), (N'ул. rrrrrrrrrrr and ggg 10,20,100'); with cte0 as( select STUFF(s, CHARINDEX(',', s) - CHARINDEX(' ', REVERSE(SUBSTRING(s, 1, CHARINDEX(',', s) - 1))), 1, ',') as s from @t) ,cte as( select s, number as pos, dense_rank() over(partition by s order by number) as r, CHARINDEX(',', s) as pos1 from cte0 t join master..spt_values v on v.type= 'P' and v.number < LEN(s) where substring(s,number, 1) = ',' ) select substring(t1.s, 1, t1.pos1 - 1) + ' ' + substring(t1.s, t1.pos +1, isnull(t2.pos, LEN(t1.s) + 1) - t1.pos - 1) from cte t1 left join cte t2 on t1.s= t2.s and t1.r + 1 =t2.r ул. rrrrrrrrrrr and ggg 10 ул. rrrrrrrrrrr and ggg 20 ул. rrrrrrrrrrr and ggg 100 ул. Тестовая 1 ул. Тестовая 2 ул. Тестовая 3 ул. Тестовая 4 ул. Тестовая 5 ул. Тестовая 6 ул. Тестовая 7 |
23 авг 12, 23:26 [13057877] Ответить | Цитировать Сообщить модератору |
user89 Member Откуда: Сообщений: 2083 |
Neumexa,declare @t table (s varchar(8000)) insert @t select 'ул. Тестовая 10,20,70' union all select 'ул. Самая Главная 175,5,95' union all select 'просто улица' union all select 'ул.' ;with t1 as ( select isnull(left(s, len(s) + nullif(charindex(',',s),0)*0 - charindex(' ', reverse(s))), s) [s], stuff(s, 1+len(s) + nullif(charindex(',',s),0)*0 - charindex(' ', reverse(s)), 1, ',') + ',' [a] from @t ), t2 as ( select s, substring(a,t+1,8000) [a], left(a,t-1) [st] from t1 outer apply(select charindex(',',a)t)t union all select s, substring(a,t+1,8000), left(a,t-1) from t2 cross apply(select charindex(',',a)t)t where t > 0 ) select isnull(s +' '+ st, s) [Result] from t2 where (s <> st) or (st is null) option (maxrecursion 0) |
24 авг 12, 11:17 [13058886] Ответить | Цитировать Сообщить модератору |
Neumexa Member Откуда: Сообщений: 202 |
Спасибо всем но не работает ни один код. Может из -за версии. У меня sql 2000 |
27 авг 12, 15:12 [13070239] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
да, из-за этого нуу, ответы - даны, так что - устанавливайте 2005-тый серевер ![]() |
||
27 авг 12, 15:16 [13070279] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Neumexa, ну, используйте что-то такое: Функция, которая делит строку на слова или без функции: Как удалить лишнее из строки? Только хорошо бы у себя где-нибудь постоянную таблицу с числами создать. Вместо master.dbo.spt_values |
27 авг 12, 15:22 [13070334] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Но это же тривиальная задача |
||
27 авг 12, 15:23 [13070346] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |