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

Откуда:
Сообщений: 15
День добрый, товарищи! Подскажите пож-ста, как в строке найти заглавную букву, после чего разделить пробелом (sql). Пример, имеем "ИвановИванИванович", в итоге должно быть "Иванов Иван Иванович".
11 окт 11, 12:41    [11418963]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
shut-up-and-skate
Member

Откуда: ВАО
Сообщений: 4259
Alchenok,

наверно процедуру придется писать...
11 окт 11, 12:46    [11419012]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
shut-up-and-skate
Member

Откуда: ВАО
Сообщений: 4259
shut-up-and-skate
Alchenok,

наверно процедуру придется писать...
т.е. функцию
11 окт 11, 12:47    [11419037]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
Alchenok
Member

Откуда:
Сообщений: 15
shut-up-and-skate,

так вот я и обращаюсь за помощью, т.к. у меня не получается :(.
11 окт 11, 12:49    [11419050]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
shut-up-and-skate
Member

Откуда: ВАО
Сообщений: 4259
Alchenok,
проверяеш каждый символ в строке и если он заглавный то добавляем пробел
if UNICODE(@chartmp) = UNICODE(UPPER(@chartmp))
после этого символа
11 окт 11, 12:56    [11419136]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Alchenok,
SELECT ASCII(UPPER('и')),ASCII('и')

SELECT CHAR(200)

SELECT PATINDEX('%И%','иваИванович')

select charindex('И','ваИванович')  

PATINDEX реагирует на маленькую букву 'и', поэтому может через коды символов искать?
11 окт 11, 12:57    [11419154]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alchenok,

declare @s varchar(100) = 'ИвановИванИванович'

select case when ASCII(s) = ASCII(UPPER(s)) and number > 1 then ' ' else '' end + s
from(
	select substring(@s,number,1)s, number
	from master..spt_values
	where type = 'P' and number between 1 and LEN(@s)
)t
order by number
for xml path('')
11 окт 11, 13:05    [11419263]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Почему
SELECT CHAR(200)
SELECT REPLACE(N'иваИванович',CHAR(200),char(32) + CHAR(200))
так странно работает?
11 окт 11, 13:12    [11419346]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
aleks2
Guest
declare @s nvarchar(100)
set @s=N'ИвановИванИванович'

select STUFF(@s, PATINDEX( N'%[а-я][А-Я]%', @s collate Latin1_General_BIN)+1, 0, ' ') 

ЗЫ. Имя коллейшен надо бы на кириллическое сменить. Но я наизусть не помню.
11 окт 11, 13:15    [11419386]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
trew,

наверное вы ожидали что будет так?
SELECT CHAR(200)
SELECT REPLACE(N'иваИванович' collate Cyrillic_General_CS_AS,CHAR(200),char(32) + CHAR(200))
тогда читайте про колейшн.
11 окт 11, 13:15    [11419389]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
shut-up-and-skate
Member

Откуда: ВАО
Сообщений: 4259
create table #tmptable125(
	id		int,
	name	varchar(500)
)

insert into #tmptable125 
	select 1, 'ИвановИванИванович'
	union all
	select 2, 'ПетровПетрПетрович'

declare 
	@i			int,
	@namelen	int,
	@id			int,
	@name		varchar(500),
	@tmpname	varchar(500),
	@chartmp	char
	
declare cTMP125 cursor for
	select id, name
	from #tmptable125

open cTMP125
while 1 = 1 begin
	fetch from cTMP125 into @id, @name
	if @@fetch_status = -1 break
	if @@fetch_status = -2 or len(@name)<1 continue
	
	set @namelen = len(@name)
	set @tmpname = ''
	
	
	set @i = 1
	while @i <= @namelen begin
			
		set @chartmp = SUBSTRING(@name, @i, 1)			
	
		if UNICODE(@chartmp) = UNICODE(UPPER(@chartmp))
		begin
			set @tmpname = @tmpname + ' ' + @chartmp
		end 
		else 
		begin
			set @tmpname = @tmpname + @chartmp		
		end
		
		set @i = @i + 1
	end

	update #tmptable125
	set name = @tmpname
	where id = @id

end
deallocate cTMP125

select * from #tmptable125

drop table #tmptable125
11 окт 11, 15:32    [11420816]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
aleks2
Guest
Плод больной фантазии?
11 окт 11, 15:39    [11420905]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
aleks2
declare @s nvarchar(100)
set @s=N'ИвановИванИванович'

select STUFF(@s, PATINDEX( N'%[а-я][А-Я]%', @s collate Latin1_General_BIN)+1, 0, ' ') 

ЗЫ. Имя коллейшен надо бы на кириллическое сменить. Но я наизусть не помню.

Дык только один пробел поставит это
автор
Иванов ИванИванович
11 окт 11, 15:40    [11420920]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
shut-up-and-skate,

Отвыкайте от курсорных подходов...
11 окт 11, 15:42    [11420944]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
aleks2
Guest
Fire83
aleks2
declare @s nvarchar(100)
set @s=N'ИвановИванИванович'

select STUFF(@s, PATINDEX( N'%[а-я][А-Я]%', @s collate Latin1_General_BIN)+1, 0, ' ') 

ЗЫ. Имя коллейшен надо бы на кириллическое сменить. Но я наизусть не помню.

Дык только один пробел поставит это
автор
Иванов ИванИванович

Ну дык повторить то не судьба?
11 окт 11, 19:27    [11422901]     Ответить | Цитировать Сообщить модератору
 Re: Заглавная буква в строке  [new]
NoLock
Member

Откуда: левый верний угол
Сообщений: 90
Извините, не удержался:

DECLARE @name nvarchar(128) ='IvanIvanychIvanov'
DECLARE @sProbelom nvarchar(128) = ''
;with Bukwy(id, bukwa, hwost) as
(
select 0, LEFT(@name, 1), RIGHT(@name, LEN(@name)-1)
union all
select id+2, LEFT(hwost, 1), RIGHT(hwost, LEN(hwost)-1) from Bukwy where LEN(hwost)>0
)
, Probely(id, bukwa) as
(
select id, bukwa from Bukwy
union all select id-1, ' ' from Bukwy
where ASCII(bukwa) = ASCII(UPPER(bukwa))
and id > 0
)
select @sProbelom = @sProbelom + bukwa from Probely order by id
select @sProbelom
11 окт 11, 19:52    [11423035]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить