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

Откуда:
Сообщений: 202
как легче разбить запись
ул. Тестовая 1,2,3,4,5,6,7

на
ул. Тестовая 1
ул. Тестовая 2
ул. Тестовая 3
ул. Тестовая 4 и т.д.?
23 авг 12, 17:37    [13056724]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
Neumexa
Member

Откуда:
Сообщений: 202
Спасибо всем но не работает ни один код.

Может из -за версии.
У меня sql 2000
27 авг 12, 15:12    [13070239]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
qwerty112
Guest
Neumexa
Спасибо всем но не работает ни один код.

Может из -за версии.
У меня sql 2000

да, из-за этого

нуу, ответы - даны, так что - устанавливайте 2005-тый серевер
27 авг 12, 15:16    [13070279]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
iap
Member

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

ну, используйте что-то такое: Функция, которая делит строку на слова
или без функции: Как удалить лишнее из строки?
Только хорошо бы у себя где-нибудь постоянную таблицу с числами создать. Вместо master.dbo.spt_values
27 авг 12, 15:22    [13070334]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить 1 запись на несколько  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
iap
Neumexa,

ну, используйте что-то такое: Функция, которая делит строку на слова
или без функции: Как удалить лишнее из строки?
Только хорошо бы у себя где-нибудь постоянную таблицу с числами создать. Вместо master.dbo.spt_values
Остаётся только проблема с отделением начала Вашей строки от списка.
Но это же тривиальная задача
27 авг 12, 15:23    [13070346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить