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

Откуда:
Сообщений: 116
помогите разобрать строку на столбцы в качестве разделителя используется ";"
есть строка
string
1233891.16;97691.07;301520.02;174450.00


ее нужно преобразовать в
str_1 str_2 str_3 str_4
1233891.16 97691.07 301520.02 174450.00

вот что я уже сделал. Осталось разобрать еще 2 столбца
declare @TStr table
(
  [str] varchar(100)
)
  
insert into @TStr ([str])
values
  ('1233891.16;97691.07;301520.02;174450.00'),
  ('661854.78;100857.71;326121.94'),
  ('552381.96;101032.49;294306.73'),
  ('605691.61;101032.49;310598.15'),
  ('205442.04;100614.72;266119.04;9000.00'),
  ('1179353.10;101065.99;300851.09;4800.00'),
  ('1753348.15;94328.25;341817.07;13500.00'),
  ('1561827.61;107803.72;304755.53;8000.00'),
  ('700228.96;101065.99;277423.56'),
  ('205442.04;100614.72;266119.04;9000.00'),
  ('1179353.10;101065.99;300851.09;4800.00'),
  ('1753348.15;94328.25;341817.07;13500.00'),
  ('1561827.61;107803.72;304755.53;8000.00'),
  ('490304.93;100857.71;322673.59'),
  ('834248.42;100352.24;344241.32'),
  ('700228.96;101065.99;277423.56'),
  ('538914.03;114305.40;322018.98;7500.00')

select 
  s.[str] as 'Str',
    
  substring(s.[str],1,charindex(';',s.[str])-1) as 'Column_1', 
  charindex(';',s.[str])-1 as 'LengthColumn_1',
  
  substring(s.[str],charindex(';',s.[str])+1,charindex(';',s.[str])-2) as 'Column_2',
  charindex(';',s.[str])-1 as 'LengthColumn_2',
 
  len(s.[str]) 'LengthStr',
  len(replace(s.[str],';',';;'))-len(s.[str]) as 'TotalSeparator'
from @TStr s 
26 сен 13, 20:53    [14889701]     Ответить | Цитировать Сообщить модератору
 Re: разделение информации, находящиеся в одной строке  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
https://www.sql.ru/articles/mssql/03060701arraysandlistsinsqlserver.shtml
26 сен 13, 22:14    [14890037]     Ответить | Цитировать Сообщить модератору
 Re: разделение информации, находящиеся в одной строке  [new]
zxc1257
Member

Откуда:
Сообщений: 71
а вы bcp/bulk insert не рассматриваете? строчки ведь с неба не падают. откуда-то вы их берете?
26 сен 13, 23:10    [14890280]     Ответить | Цитировать Сообщить модератору
 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-LEN(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+LEN(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<len(@str)
) 
SELECT SUBSTRING(@str, n1+LEN(@delimiter), n2-n1-1) as Value, Number, n1+1 as StartPosition FROM str_nums

) 
27 сен 13, 06:36    [14890708]     Ответить | Цитировать Сообщить модератору
 Re: разделение информации, находящиеся в одной строке  [new]
aleks2
Guest
declare @TStr table
(
  [str] varchar(100)
)
  
insert into @TStr ([str])
values
  ('1233891.16;97691.07;301520.02;174450.00'),
  ('661854.78;100857.71;326121.94'),
  ('552381.96;101032.49;294306.73'),
  ('605691.61;101032.49;310598.15'),
  ('205442.04;100614.72;266119.04;9000.00'),
  ('1179353.10;101065.99;300851.09;4800.00'),
  ('1753348.15;94328.25;341817.07;13500.00'),
  ('1561827.61;107803.72;304755.53;8000.00'),
  ('700228.96;101065.99;277423.56'),
  ('205442.04;100614.72;266119.04;9000.00'),
  ('1179353.10;101065.99;300851.09;4800.00'),
  ('1753348.15;94328.25;341817.07;13500.00'),
  ('1561827.61;107803.72;304755.53;8000.00'),
  ('490304.93;100857.71;322673.59'),
  ('834248.42;100352.24;344241.32'),
  ('700228.96;101065.99;277423.56'),
  ('538914.03;114305.40;322018.98;7500.00')
  
select 
  s.[str], ss.*
from @TStr s cross apply [dbo].[f_StrToTableEx](s.[str], ';') ss
  
27 сен 13, 06:41    [14890712]     Ответить | Цитировать Сообщить модератору
 Re: разделение информации, находящиеся в одной строке  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
aleks2, спасибо!

Вообще хотелось в одну строку.
27 сен 13, 11:31    [14891627]     Ответить | Цитировать Сообщить модератору
 Re: разделение информации, находящиеся в одной строке  [new]
Гость333
Member

Откуда:
Сообщений: 3683
select s.str,
       substring(ss.str, 1, a.first - 1) as str_1,
       substring(ss.str, a.first  + 1, b.second - a.first  - 1) as str_2,
       substring(ss.str, b.second + 1, c.third  - b.second - 1) as str_3,
       substring(ss.str, c.third  + 1, d.fourth - c.third  - 1) as str_4
from @TStr s
     cross apply (select s.str + ';;;;' as str) ss
     cross apply (select charindex(';', ss.str) as first) a
     cross apply (select charindex(';', ss.str, a.first  + 1) as second) b
     cross apply (select charindex(';', ss.str, b.second + 1) as third)  c
     cross apply (select charindex(';', ss.str, c.third  + 1) as fourth) d
27 сен 13, 11:46    [14891705]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить