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

Откуда: Киев
Сообщений: 49
Задача извратная:
есть стринг, например "ABCDerttrtr" нужно получить "ABCD" и "erttrtr"
Как определить в каком регистре символ?
Спасибо.
25 окт 12, 12:02    [13373305]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Код у символа в разных регистрах тоже разный
25 окт 12, 12:03    [13373314]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
trew
Member

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

SELECT ASCII('А'), ASCII('а'), UPPER('ABCDerttrtr') ,LOWER('ABCDerttrtr')
25 окт 12, 12:12    [13373395]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
может поможет

select patindex( N'%[A]%' collate Cyrillic_General_CS_AS , N'123aAbBcC' collate Cyrillic_General_CS_AS )
select patindex( N'%[a]%' collate Cyrillic_General_CS_AS , N'123aAbBcC' collate Cyrillic_General_CS_AS )
25 окт 12, 12:21    [13373492]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Crimean
может поможет

select patindex( N'%[A]%' collate Cyrillic_General_CS_AS , N'123aAbBcC' collate Cyrillic_General_CS_AS )
select patindex( N'%[a]%' collate Cyrillic_General_CS_AS , N'123aAbBcC' collate Cyrillic_General_CS_AS )

Тогда уж так:
select patindex( N'%[A-Z]%' collate Cyrillic_General_CS_AS , N'123aAbBcC' collate Cyrillic_General_CS_AS )
select patindex( N'%[a-z]%' collate Cyrillic_General_CS_AS , N'123aAbBcC' collate Cyrillic_General_CS_AS )
25 окт 12, 12:24    [13373516]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
DECLARE
 @S VARCHAR(100)='ABCDerttrtr'
,@UpperS VARCHAR(100)='ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
,@LowerS VARCHAR(100)='abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя';

SELECT
 LEFT(@S,CASE WHEN @S LIKE '['+@UpperS+']%'COLLATE Cyrillic_General_BIN THEN PATINDEX('%['+@LowerS+']%'COLLATE Cyrillic_General_BIN,@S) ELSE PATINDEX('%['+@UpperS+']%'COLLATE Cyrillic_General_BIN,@S) END-1)
,STUFF(@S,1,CASE WHEN @S LIKE '['+@UpperS+']%'COLLATE Cyrillic_General_BIN THEN PATINDEX('%['+@LowerS+']%'COLLATE Cyrillic_General_BIN,@S) ELSE PATINDEX('%['+@UpperS+']%'COLLATE Cyrillic_General_BIN,@S) END-1,'');
25 окт 12, 12:27    [13373547]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
craz
Member

Откуда: Киев
Сообщений: 49
Всем большое спасибо!
25 окт 12, 12:48    [13373689]     Ответить | Цитировать Сообщить модератору
 Re: ка определить регистр символа?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap совершенно прав, использовать надо Cyrillic_General_BIN, доказательство:

select NCHAR(number) from master..spt_values where type = 'P'
and NCHAR(number) like N'[a-z]' COLLATE Cyrillic_General_CS_AS
except
select NCHAR(number) from master..spt_values where type = 'P'
and NCHAR(number) like N'[a-z]' COLLATE Cyrillic_General_BIN


Попробовал объединить проверку со скриптом парсинга строки, чтобы строка делилась на блоки с одинаковым регистром. Получился такой слегка монструозный, но, вроде бы, работающий скрипт:

declare @somestring nvarchar(4000) = N'ABclhljHJHJHljhHJljhHjohTOLKHLKJ';

with cte
as
(
 select 1 id, 
        convert(nvarchar(max), @somestring) as str, 
        convert(nvarchar(max), '') val 
 union all
 select id+1, 
        stuff(str, 
              1, 
              patindex(case PATINDEX(N'%[A-Z]%', str collate Cyrillic_General_BIN ) 
                         when 1 
                           then N'%[a-z]%' 
                           else N'%[A-Z]%' 
                         end, 
                       str 
                       collate Cyrillic_General_BIN )-1, 
              ''), 
        case patindex(case PATINDEX(N'%[A-Z]%', str collate Cyrillic_General_BIN) 
                                      when 1 
                                        then N'%[a-z]%' 
                                        else N'%[A-Z]%' 
                                      end, str collate Cyrillic_General_BIN) 
                    when 0 
                      then str
                      else substring(str, 
                  0, 
                  patindex(case PATINDEX(N'%[A-Z]%', str collate Cyrillic_General_BIN) 
                                      when 1 
                                        then N'%[a-z]%' 
                                        else N'%[A-Z]%' 
                                      end, 
                                    str 
                                    collate Cyrillic_General_BIN)) end
from cte
where val is not null
)
select val from cte where val!='' order by id
25 окт 12, 15:46    [13375188]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить