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

Откуда:
Сообщений: 2011
Подскажите, пожалуйста, как правильно разбить значение столбца на несколько составляющих столбцов
напимер в таблице proba
id         name          string
1    12131/1313            e
2    434545/4234           er
3    5235545/4534         ert

получить
id         INN       KPP   string
1        12131     1313    e
2       434545     4232    er
3      5235545    4534    ert


Распарсить строку у меня вроде получилось т.е.
declare @string varchar(100)
declare @INN varchar(100)
declare @KPP varchar(100)
declare @delimeter char

set @delimeter ='/'
declare @s1 int
declare @s2 int
set @string ='12313/1231245'
select 
@s1=charindex(@delimeter,@string ),
@s2=len(@string),
@INN=substring(@string ,0,@s1),
@KPP=substring(@string ,@s1+1,@s2)
select @INN as INN,@KPP as KPP

но как "скормить" вместо @string ='12313/1231245' все поочередно строки таблицы proba не знаю. Помогите разобраться
10 сен 12, 23:45    [13143132]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
aleks2
Guest
select id
     , left(name, charindex('/',name )-1) inn
     , substring(name, charindex('/',name )+1, 4000) as kpp
from proba
11 сен 12, 05:44    [13143418]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @t table ( id int, name varchar(100), string char(3) )
insert into @t
values ( 1, '12131/1313', 'e' ), (2, '434545/4234', 'er' ), ( 3, '5235545/4534', 'ert' )

select id
     , parsename ( replace( name, '/', '.' ), 2 ) INN 
     , parsename ( replace( name, '/', '.' ), 1 ) KPP 
     , string
from @t
11 сен 12, 08:16    [13143494]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
select id
     , a.b.value( 'inn[1]', 'varchar(10)' ) inn
     , a.b.value( 'kpp[1]', 'varchar(10)' ) kpp
     , string
from ( select id
            , cast( '<inn>' + replace( name, '/', '</inn><kpp>' ) + '</kpp>' as xml ) xml_val
            , string
         from @t
     ) t        
cross apply xml_val.nodes( '.' ) a(b)
11 сен 12, 08:23    [13143502]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
Спасибо. Еще один вопрос по строкам и операторам IF ... THEN или CASE. Есть строка "001110" пытаюсь найти номер первой единицы и в зависимости от этого присвоить значение. В данном случае мне нужно получить на выходе "третий номер".
11 сен 12, 10:21    [13143972]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
charindex
11 сен 12, 10:23    [13144000]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Chek_Fedor,

А зачем Вам "IF ... THEN или CASE"? Вы же уже знаете о существовании функции CHARINDEX. Её не достаточно? Зачем усложнять?
11 сен 12, 10:25    [13144012]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
Да пока не знаю для чего мне нужен IF.... задача следующая есть строка из 12 символов
представляющая собой календарь (12 месяцев) "00001111111" 0-нет подписки на издание, 1-в этом месяце ты получишь газетенку т.е. мне нужно определить дату начала подписки в данном случае начало подписки май месяц
11 сен 12, 11:28    [13144476]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Glory
Member

Откуда:
Сообщений: 104751
Написать CASE c 12-ю SUBSTRING
11 сен 12, 11:35    [13144550]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]

Guest
если слева всегда нули ( если подписка начинается всегда слева)
select len(replace('00001111111' ,'1','')) +1

это только идея.
11 сен 12, 11:45    [13144661]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
mike909
Member

Откуда:
Сообщений: 662
Chek_Fedor
Да пока не знаю для чего мне нужен IF.... задача следующая есть строка из 12 символов
представляющая собой календарь (12 месяцев) "00001111111" 0-нет подписки на издание, 1-в этом месяце ты получишь газетенку т.е. мне нужно определить дату начала подписки в данном случае начало подписки май месяц

declare @str nvarchar(12)

set @str =  N'00001111111'
--set @str =  N'00000000000'

SELECT dateadd(month, case when t.mn=0 then null else t.mn-1 end, dateadd(year,datediff(year,0,getdate()),0))
FROM (select charindex('1',@str) as mn) as t
11 сен 12, 11:49    [13144696]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
set language russian
declare @str nvarchar(12)
set @str =  N'00001111111'
select datename( m, dateadd( m, charindex( '1', @str ), 0 ) - 1 )
11 сен 12, 11:56    [13144799]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
user89
Member

Откуда:
Сообщений: 2083
set language russian
declare @str nvarchar(12)
select @str = N'000011111111'--, @str = N'000000000000'
select datename(mm, dateadd(mm, nullif(charindex('1', @str),0), 0 ) - 1 )

select dateadd(mm, nullif(charindex('1', @str),0)-1, '2012')
11 сен 12, 12:41    [13145180]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
Упс..., что то у меня трудности с SET и select тут задаем строку фиксировано, а я ее должен вытащить из таблицы.
Да, вот еще... хотел прикрутить IF... в следующую конструкцию
есть две таблицы между собой не связанных (во всяком случае по полю)

Таб_1
id   n1  n2
1    4   3
2    6   9
3    7   2


Таб_2
id   m  m2
1    1   3
2    0   9
3    0   2

так вот выборку нужно сделать следующим образом
если Таб_2.m=1 то из таблицы 1 выбираем столбец n1 если Таб_2.m=1 то Таб_1.n2
хотел в наглую проверить
if (select Таб_2.m from Таб_2)=1
begin
select Таб_2.m Таб_2.n1 from Таб_2 inner join Таб_2
end else
select Таб_2.m Таб_2.n1 from Таб_2 inner join Таб_2
.....

типа можно вставит результат в какие нибуть временные таблицы потом объединить.. но что то не прокатывает.
11 сен 12, 13:16    [13145482]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Glory
Member

Откуда:
Сообщений: 104751
Chek_Fedor
так вот выборку нужно сделать следующим образом
если Таб_2.m=1 то из таблицы 1 выбираем столбец n1 если Таб_2.m=1 то Таб_1.n2

И для какой же _записи_ брать Таб_1.n1 или Таб_1.n2, если "есть две таблицы между собой не связанных" ?
11 сен 12, 13:25    [13145578]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строку на два столбца  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
Извиняйте В таб_3 есть поле назовем его agent таб_3 связана с Таб_1 и Таб_2. Так что связи типа есть только не на уровне базы, а наверное в исходниках прописано (но это не столь важно)
11 сен 12, 13:53    [13145785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить