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

Откуда:
Сообщений: 67
Добрый день, уважаемые формучане!

Прошу подсказать советом: как реализовать следующую задачку
Имеется таблица два поля
Table (ID, Word)
Пример:
ID Word
1 1\0\1\0\1\1\0\0
2 0\1\1\1\0\0\1\1
3 \0\0\1\1\1\1\1

Количество разделителей одинаковое:
Необходимо в конце получить новую таблицу

ID S1 S2 S3 S4 S5 S6 S7
1 1 0 1 0 1 0 0
2 0 1 1 1 0 1 1
3 Null 0 0 1 1 1 1

Хотелось бы уточнить возможно ли это осуществить c помощью substring и charindex ?
22 авг 14, 13:30    [16479687]     Ответить | Цитировать Сообщить модератору
 Re: Разделить столбец  [new]
iap
Member

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

сначала получить пронумерованные строки для каждого значения между разделителями,
а потом - PIVOT или аналоги с MIN(CASE WHEN THEN ELSE).
Ясно, что всё это можно сделать в одном SELECTе, если количество значений известно заранее.
22 авг 14, 13:47    [16479854]     Ответить | Цитировать Сообщить модератору
 Re: Разделить столбец  [new]
VGalamakh
Member

Откуда: Киев (Альба)
Сообщений: 66
declare @t table
(ID int,
 word varchar(50),
 n1 int,
 n2 int,
 n3 int,
 n4 int,
 n5 int,
 n6 int,
 n7 int
 )

insert  @t 
Select 1,'1\0\1\0\1\1\0\0',0,0,0,0,0,0,0
union all
Select 2,'0\1\1\1\0\0\1\1',0,0,0,0,0,0,0
union all
Select 3,'\0\0\1\1\1\1\1',0,0,0,0,0,0,0

--n2=CHARINDEX('\',substring(word,n1,len(word)),1),

update @t
set n1=CHARINDEX('\',word,1)


update @t
set n2=CHARINDEX('\',substring(word,n1+1,len(word)),1)+n1

update @t
set n3=CHARINDEX('\',substring(word,n2+1,len(word)),1)+n2

update @t
set n4=CHARINDEX('\',substring(word,n3+1,len(word)),1)+n3

update @t
set n5=CHARINDEX('\',substring(word,n4+1,len(word)),1)+n4

update @t
set n6=CHARINDEX('\',substring(word,n5+1,len(word)),1)+n5

update @t
set n7=CHARINDEX('\',substring(word,n6+1,len(word)),1)+n6

Select ID,
case substring(word,0,n1) when '' then null else substring(word,0,n1) end S1,
case substring(word,n1+1,n2-n1-1) when '' then null else substring(word,n1+1,n2-n1-1) end S2,
case substring(word,n2+1,n3-n2-1) when '' then null else substring(word,n2+1,n3-n2-1) end S3,
case substring(word,n3+1,n4-n3-1) when '' then null else substring(word,n3+1,n4-n3-1) end S4,
case substring(word,n4+1,n5-n4-1) when '' then null else substring(word,n4+1,n5-n4-1) end S5,
case substring(word,n5+1,n6-n5-1) when '' then null else substring(word,n5+1,n6-n5-1) end S6,
case substring(word,n6+1,n7-n6-1) when '' then null else substring(word,n6+1,n7-n6-1) end S7,
case substring(word,n7+1,LEN(word)) when '' then null else substring(word,n7+1,LEN(word)) end S8

 from @t 
22 авг 14, 16:55    [16481234]     Ответить | Цитировать Сообщить модератору
 Re: Разделить столбец  [new]
igor171
Member

Откуда:
Сообщений: 67
Спасибо за ответы, буду думать как лучше поступить ...
22 авг 14, 17:58    [16481577]     Ответить | Цитировать Сообщить модератору
 Re: Разделить столбец  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
Задействуйте ssis, пропустите строку через Script компонент в dataflow и там можете использовать string.Split и все возможности .NET. Это будет быстрее извращений с charindex
22 авг 14, 18:12    [16481612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить