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

Откуда:
Сообщений: 20
Работаю с адаптацией казахских адресов в русский язык.
Сайт почты Казахстана предлагает справочники, где в русских названиях используются символы расширенной казахской кириллицы.
Я этот справочник при помощи SSIS перегоняю из исходного UTF8 в nvarchar, и далее мне предстоит заменить казахские буквы наиболее близкими по звучанию русскими (так как в дальнейшем эти сведения будут использоваться в не поддерживающий казахский алфавит системе). Таблица транслитерации предоставлена заказчиком.
Важно - большие буквы заменить большими, маленькие - маленькими.
В БД используется кириллический регистронезависимый Collation.
Можно ли написать хранимую функцию транслитерации, в которой replace будет регистрозависимым?

Или даже абстрагируемся от казахского языка: можно ли в базе с регистронезависимым Collation реализовать замену 'Ё' на 'Е', а 'ё' на 'е' ?
26 июн 19, 22:29    [21915856]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28727
Trurl
В БД используется кириллический регистронезависимый Collation.
Можно ли написать хранимую функцию транслитерации, в которой replace будет регистрозависимым?

Или даже абстрагируемся от казахского языка: можно ли в базе с регистронезависимым Collation реализовать замену 'Ё' на 'Е', а 'ё' на 'е' ?
Да, используйте выражение COLLATE с регистрозависимым коллейшеном
select REPLACE(REPLACE(N'Ё-моё' collate Cyrillic_General_CS_AI, N'Ё', N'Е'), N'ё', N'е')
26 июн 19, 22:40    [21915859]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 31763
Блог
или по ASCII-коду менять
27 июн 19, 00:41    [21915876]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Alibek B.
Member

Откуда:
Сообщений: 3117
Какой ASCII в UTF?
27 июн 19, 09:58    [21915954]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
court
Member

Откуда:
Сообщений: 1736
Alibek B.
Какой ASCII в UTF?
нуу код символа имелся в виду, чо придираешься :)

раз у тебя "перегоняю из исходного UTF8 в nvarchar", то функцией UNICODE
select UNICODE(N'ё'), ASCII('ё')
27 июн 19, 10:05    [21915960]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Alibek B.
Member

Откуда:
Сообщений: 3117
court
нуу код символа имелся в виду, чо придираешься

Если придираться, то в UTF не код символа, а кодовая точка (code point).
27 июн 19, 10:49    [21915996]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Владислав Колосов
Member

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

эта задача решается скриптом на С#, который встраивается в SSIS пакет. Не нужны никакие функции.
27 июн 19, 12:10    [21916077]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28727
Владислав Колосов
эта задача решается скриптом на С#, который встраивается в SSIS пакет. Не нужны никакие функции.
Там тоже придётся вызывать какие нибуть функции :-)
Конечно, для сложных перекодировок лучше использовать C#, но для замены Ё на Е я бы всё таки вызвал REPLACE.
27 июн 19, 17:10    [21916448]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Владислав Колосов
Member

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

там не просто е на ё, автору задан массив преобразований.
27 июн 19, 17:36    [21916468]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28727
Владислав Колосов
alexeyvg,

там не просто е на ё, автору задан массив преобразований.
Если именно замена буквы на букву по массиву преобразований, то я бы тоже подумал.
Непонятен масшаб, к тому же тут нет каких то действий, для которых существуют стандартные библиотеки (наподобии перекодировки).

С другой стороны, если автор уже делает это:
Trurl
при помощи SSIS перегоняю из исходного UTF8 в nvarchar
и делается это в скрипт таске, то лучше туда же добавить и эту замену, тем более что так будет быстрее.
27 июн 19, 17:57    [21916482]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Trurl
Member

Откуда:
Сообщений: 20
Реализовал через посимвольный анализ строки и подстановку через

case unicode(@substring)


где @substring - это NCHAR(1)
всего 9 пар казахских символов + русские Ёё
На всём массиве казахских адресов отрабатывает за приемлемое время.

метод с collation в запросе (который так хорошо справляется с Ёё => Ee) не справляется с четырьмя казахскими символами, пришлось отказаться

Всем спасибо
27 июн 19, 19:03    [21916548]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28727
Trurl
метод с collation в запросе (который так хорошо справляется с Ёё => Ee) не справляется с четырьмя казахскими символами, пришлось отказаться
А можете привести пример такого символа? Это очень странно, нужно сообщить о баге в Микрософт.
27 июн 19, 19:45    [21916587]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Trurl
Member

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

https://upload.wikimedia.org/wikipedia/commons/e/e4/Keyboard_KAZ.png

верхний ряд, третья слева и вторая справа (строчные и прописные)
27 июн 19, 22:00    [21916653]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28727
Trurl
alexeyvg,

https://upload.wikimedia.org/wikipedia/commons/e/e4/Keyboard_KAZ.png

верхний ряд, третья слева и вторая справа (строчные и прописные)
Странно, почему у вас сервер не справился, у меня справился
select REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
	N'Ё-моё әөӘӨ' 
	collate Cyrillic_General_CS_AI, N'Ё', N'Е'), N'ё', N'е') 
	collate Kazakh_100_CS_AI, N'Ә', N'Е'), N'ә', N'е'), N'Ө', N'О'), N'ө', N'о')

ЗЫ. Тут казахские буквы показываются знаком вопроса, какой то косяк, но я в примере использовал соотв буквы из виртуальной клавиатуры https://www.virtual-keyboard-online.com/ru/kazakh/
Приложил картинкой

К сообщению приложен файл. Размер - 8Kb
28 июн 19, 13:52    [21917040]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28727
alexeyvg
Странно, почему у вас сервер не справился, у меня справился
Результат, соответственно, "Е-мое еоЕО"
28 июн 19, 13:54    [21917042]     Ответить | Цитировать Сообщить модератору
 Re: REPLACE больших букв большими, маленьких - маленькими  [new]
Trurl
Member

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

Ваш метод работает, спасибо.
6 июл 19, 21:13    [21922098]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить