Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Строка  [new]
Чайник42
Guest
Как разбит эту строку «Максимов Максим Максимович» так
Максимов
Максим
Максимович
6 июл 11, 15:15    [10932894]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Чайник42, конкретно эту или вообще?
6 июл 11, 15:18    [10932926]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Чайник42
Guest
да а как же....
6 июл 11, 15:21    [10932946]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Чайник42
да а как же....

с помощью таблицы чисел или через XML
6 июл 11, 15:24    [10932996]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Чайник42
Guest
с помощью таблицы
6 июл 11, 15:27    [10933027]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
или реплейс, парсенайм + анпивот... Короче говоря - вариантов море. Но вы жеж о входных данных не признаетесь. Особенно о вариантах типа "Бумбек-назарович Иль Сабиб Оглы" - такое тоже должно разобрать? А "Иванов И.И."?
6 июл 11, 15:28    [10933028]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Чайник42
с помощью таблицы

с мобилки пишите?
6 июл 11, 15:28    [10933045]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Устал ждать ответа... Может действительно с мобилки. Вот вам вариант решения, который вроде у iap содрал некоторое время назад. А мож и кого другого.

DECLARE @T TABLE ( ID INT, S VARCHAR(100) ) ;
INSERT  @T( ID, S )
        SELECT  1, N'Максимов Максим Максимович'
        UNION ALL
        SELECT  2, 'Бумбек-назарович Иль Сабиб Оглы'
        UNION ALL
        SELECT  3, 'Иванов И.И.'
        
DECLARE @Delimiters VARCHAR(100) ;
SET @Delimiters = ' .' ; -- Что считать разделетелем?

SELECT  T.ID,
        T.nPos,
        T.S
FROM    ( SELECT    T.ID,
                    SUBSTRING(T.S COLLATE Cyrillic_General_CI_AI, V.number, ( SELECT    MIN(VV.number)
                                                                              FROM      master.dbo.spt_values VV
                                                                              JOIN      @T TT
                                                                              ON        TT.ID = T.ID
                                                                                        AND VV.type = 'P'
                                                                                        AND VV.number BETWEEN V.number AND LEN(TT.S) + 1
                                                                                        AND CHARINDEX(SUBSTRING(TT.S + LEFT(@Delimiters, 1), VV.number, 1), @Delimiters) > 0
                                                                            ) - V.number) AS S,
                    V.number AS nPos
          FROM      @T T
          CROSS JOIN master.dbo.spt_values V
          WHERE     V.type = 'P'
                    AND V.number BETWEEN 1 AND LEN(T.S) + 1
                    AND CHARINDEX(SUBSTRING(LEFT(@Delimiters, 1) + T.S, V.number, 1), @Delimiters) > 0
        ) T ( ID, S, nPos )
WHERE   T.S > '' -- Исключать ли пустые?
ORDER BY T.ID,
        T.nPos--,T.S -- Как соритровать?
6 июл 11, 15:45    [10933223]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
vah
Member

Откуда:
Сообщений: 2694
Вот такое шаманство ))

declare @str varchar(550)
set @str='Максимов Максим Максимович'

DECLARE @tab_str TABLE (id int IDENTITY (1, 1) NOT NULL, nom varchar(550))

DECLARE @str_temp varchar(250),@n int,@q int,@r int

set @n=0
set @q=0
set @r=0
set @str=' '+@str+' '



WHILE @n<=LEN(@str)
BEGIN

IF substring(@str,@n,1)=' '
BEGIN
SET @q=charindex(' ',@str,@n+1)-1
SET @str_temp=substring(@str,@n+1,case when @q-@n>0 then @q-@n else 1 end)

IF @str_temp<>''
BEGIN
INSERT INTO @tab_str(nom)
VALUES(ltrim(@str_temp))
END

END

SET @n=@n+1
END


select * from @tab_str
6 июл 11, 15:45    [10933224]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
kDnZP
Устал ждать ответа... Может действительно с мобилки. Вот вам вариант решения, который вроде у iap содрал некоторое время назад. А мож и кого другого.
У меня
"VV" - это как цифровая подпись прямо!

Кстати, разных модификаций было - море.
6 июл 11, 16:16    [10933548]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Чайник42
Guest
Ест пример какой-то, чтобы посмотреть
6 июл 11, 16:16    [10933553]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Чайник42
Ест пример какой-то, чтобы посмотреть
Кому вопрос? И о чём?
6 июл 11, 16:18    [10933572]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Anddros
Member

Откуда:
Сообщений: 1077
iap
kDnZP
Устал ждать ответа... Может действительно с мобилки. Вот вам вариант решения, который вроде у iap содрал некоторое время назад. А мож и кого другого.
У меня
"VV" - это как цифровая подпись прямо!

Кстати, разных модификаций было - море.

:)

До кучи. Рекурсия.

DECLARE @T TABLE ( ID INT, S VARCHAR(100) ) ;
INSERT  @T( ID, S )
        SELECT  1, N'Максимов Максим Максимович'
        UNION ALL
        SELECT  2, 'Бумбек-назарович Иль Сабиб Оглы'
        UNION ALL
        SELECT  3, 'Иванов И.И.'
        
DECLARE @Delimiters VARCHAR(100) ;
SET @Delimiters = ' .' ; -- Что считать разделетелем?

;with q as (select id, s, 1 pos, len(s) ln, cast('' as varchar(100))ss, cast('' as varchar(100))ss1 from @t
union all 
select id,s,pos+1,ln,cast(case when @Delimiters like '%'+symb+'%' then '' else ss+symb end as varchar(100)), 
case when @Delimiters like '%'+symb+'%' then ss else '' end
from q
cross apply (select substring(s,pos,1)symb)t
where pos<=ln+1 
)
select id,ss1 from q where ss1>'' order by id,pos
6 июл 11, 16:26    [10933664]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
iap
Member

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

только если среди разделителей - подчёркивание, левая квадратная скобка или процент, -
то неправильно будет работать.

Кстати, я из-за этого в последнее время склоняюсь к доброму старому CHARINDEX
6 июл 11, 17:01    [10933986]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
iap
Member

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

только если среди разделителей - подчёркивание, левая квадратная скобка или процент, -
то неправильно будет работать.

Кстати, я из-за этого в последнее время склоняюсь к доброму старому CHARINDEX
Неточно выразился.
Ну, в общем, если symb примет значение "подчёркивание", "левая квадратная скобка" или "процент", то ...
6 июл 11, 17:04    [10933999]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Anddros
Member

Откуда:
Сообщений: 1077
iap
iap
Anddros,

только если среди разделителей - подчёркивание, левая квадратная скобка или процент, -
то неправильно будет работать.

Кстати, я из-за этого в последнее время склоняюсь к доброму старому CHARINDEX
Неточно выразился.
Ну, в общем, если symb примет значение "подчёркивание", "левая квадратная скобка" или "процент", то ...
У кого в ФИО левая квадратная скобка затесалась? Поднять руки!
6 июл 11, 17:26    [10934199]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Anddros
iap
пропущено...
Неточно выразился.
Ну, в общем, если symb примет значение "подчёркивание", "левая квадратная скобка" или "процент", то ...
У кого в ФИО левая квадратная скобка затесалась? Поднять руки!
Ну, процент-то запросто!
6 июл 11, 17:30    [10934236]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Anddros
У кого в ФИО левая квадратная скобка затесалась? Поднять руки!


Пушкина [урождённая Ганнибал] Надежда Осиповна

6 июл 11, 17:32    [10934259]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ульянов(Ленин) :)
6 июл 11, 17:40    [10934327]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Glory
Ульянов[Ленин] :)
Поправил...
6 июл 11, 17:42    [10934343]     Ответить | Цитировать Сообщить модератору
 Re: Строка  [new]
Anddros
Member

Откуда:
Сообщений: 1077
iap
Anddros
пропущено...
У кого в ФИО левая квадратная скобка затесалась? Поднять руки!
Ну, процент-то запросто!
Правда? Ни разу не видел. :)

qwrqwr
Anddros
У кого в ФИО левая квадратная скобка затесалась? Поднять руки!


Пушкина [урождённая Ганнибал] Надежда Осиповна


Ну-ну... И что, здесь является, скажем, фамилией. И какими разделителями ее можно отсечь?

iap
Glory
Ульянов[Ленин] :)
Поправил...
Если скобка в данном случае является разделителем, то это проблема. Небольшая. Лечится элементарно:
;with q as (select id, s+@Delimiters s, 1 pos, len(s) ln, cast('' as varchar(100))ss, cast('' as varchar(100))ss1 from @t
union all 
select id,s,pos+1,ln,cast(case when @Delimiters like '%~'+symb+'%' escape '~' then '' else ss+symb end as varchar(100)), 
case when @Delimiters like '%~'+symb+'%' escape '~' then ss else '' end
from q
cross apply (select substring(s,pos,1)symb)t
where pos<=ln+1
)
select id,ss1 from q where ss1>'' order by id,pos

Или на худой конец для данной задачи можно действительно перейти на charindex:
;with q as (select id, s+@Delimiters s, 1 pos, len(s) ln, cast('' as varchar(100))ss, cast('' as varchar(100))ss1 from @t
union all 
select id,s,pos+1,ln,cast(case when charindex(symb,@Delimiters)>0 then '' else ss+symb end as varchar(100)), 
case when charindex(symb,@Delimiters)>0 then ss else '' end
from q
cross apply (select substring(s,pos,1)symb)t
where pos<=ln+1
)
select id,ss1 from q where ss1>'' order by id,pos

ЗЫ. Навалились, блин... :) А ведь я знал, что этим закончится...
6 июл 11, 18:21    [10934655]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить