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

Откуда: msk
Сообщений: 73
Подскажите, есть ли в postgesql функция транслитерации?
Например, чтобы можно было получить такой результат:
select _tranliteration_('Русский текст');
--
Russkij tekst
31 янв 12, 13:48    [12003631]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация в PostgreSQL  [new]
Добрый Э - Эх
Guest
суперпозиция строковых функций translate и replace тебе в помощь.
31 янв 12, 13:53    [12003703]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация в PostgreSQL  [new]
LeXa NalBat
Member

Откуда: Москва
Сообщений: 2839
create or replace function russian2translit( text ) returns text language plperl as '
        my %to;
        @to{ qw(  а б в г д е ё  ж  з и й к л м н о п р с т у ф х ц ч  ш  щ   ы э ю  я  ъ ь
        ) } = qw( a b v g d e yo zh z i y k l m n o p r s t u f h c ch sh sch i e yu ya     );
        @to{ qw(  А Б В Г Д Е Ё  Ж  З И Й К Л М Н О П Р С Т У Ф Х Ц Ч  Ш  Щ   Ы Э Ю  Я  Ъ Ь
        ) } = qw( A B V G D E YO ZH Z I Y K L M N O P R S T U F H C CH SH SCH I E YU YA     );

        my $fr = join( "|", sort keys %to );

        my $text = $_[0];
        $text =~ s/($fr)/$to{$1}/ge;

        return $text;
';
31 янв 12, 14:14    [12003954]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация в PostgreSQL  [new]
mnvx
Member

Откуда: msk
Сообщений: 73
Добрый Э - Эх,

Спасибо, сделал в итоге так

select 
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
translate(lower('Съешь ещё этих булочек и выпей чаю с баранками и будь счастлив абвгдеёжзийклмнопрстуфхцчщшьыъэюя'), 
'абвгдеёзийклмнопрстуфхць', 'abvgdeezijklmnoprstufхc`'),
'ж', 'zh'),
'ч', 'ch'),
'ш', 'sh'),
'щ', 'shh'),
'ъ', '``'),
'ы', 'y`'),
'э', 'e`'),
'ю', 'yu'),
'я', 'ya')


Если кто-то будет пользоваться, то у меня небольшое отличие от стандарта ГОСТ 7.79-2000
ё = e, а не yo
ы = y`, а не y'

Жаль, что в стандартных функциях нет готовенького
31 янв 12, 14:35    [12004156]     Ответить | Цитировать Сообщить модератору
 Re: Транслитерация в PostgreSQL  [new]
mnvx
Member

Откуда: msk
Сообщений: 73
В виде функции

CREATE OR REPLACE FUNCTION iris_translit(p_string character varying)
  RETURNS character varying AS
$BODY$
--Транслитерация
--Отличие от ГОСТ 7.79-2000
--ё = e, а не yo
--ы = y`, а не y'
select 
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
translate(lower($1), 
'абвгдеёзийклмнопрстуфхць', 'abvgdeezijklmnoprstufхc`'),
'ж', 'zh'),
'ч', 'ch'),
'ш', 'sh'),
'щ', 'shh'),
'ъ', '``'),
'ы', 'y`'),
'э', 'e`'),
'ю', 'yu'),
'я', 'ya');
$BODY$
  LANGUAGE sql IMMUTABLE
  COST 100;
31 янв 12, 15:43    [12004934]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить