Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как разделить ФИО на Ф, И, О?  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 405
В поле таблицы содержится ФИО человека. Мне нужно в результате SQL запроса получить отдельные поля Фамилия, Имя, Отчество. Как это сделать?
15 апр 09, 08:28    [7064602]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
Решается стандартно instr+substr.
15 апр 09, 08:31    [7064612]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
когда-то давно писал:
FUNCTION RETURN_FIO (C_VALUE VARCHAR2,N_CHECK NUMBER) RETURN VARCHAR2 IS
  V_VAR NUMBER;
  C_OUT VARCHAR2(130) DEFAULT NULL;
  BEGIN
   IF N_CHECK = 1 THEN
    C_OUT := SUBSTR(C_VALUE,1,INSTR(C_VALUE,' ')); --ФАМИЛИЯ--
   END IF;
   IF N_CHECK = 2 THEN
    C_OUT := SUBSTR(C_VALUE,INSTR(C_VALUE,' ',1,1)+1,INSTR(C_VALUE,' ',1,2)-INSTR(C_VALUE,' ',1,1)-1); --ИМЯ--
   END IF;
   IF N_CHECK = 3 THEN
    C_OUT := SUBSTR(C_VALUE,INSTR(C_VALUE,' ',1,2)+1);  --ОТЧЕСТВО--
   END IF;
   RETURN TRIM(C_OUT);
  END;
15 апр 09, 08:34    [7064620]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49205
Для любителей программно разбивать строку ФИО на фамилию, имя и отчество пример:
"Ханмамедова Дуня Тофик гизы"
или
"Ханмамедова Дуня Тофик-гизы"

- кто из них как пишет.
15 апр 09, 08:41    [7064634]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Павел Гужанов
В поле таблицы содержится ФИО человека. Мне нужно в результате SQL запроса получить отдельные поля Фамилия, Имя, Отчество. Как это сделать?


select substr('Иванов Иван Иванович', 1, instr('Иванов Иван Иванович', ' ')),
       substr('Иванов Иван Иванович', instr('Иванов Иван Иванович', ' ',2), instr('Иванов Иван Иванович', ' ',2) -1),
       substr('Иванов Иван Иванович', -instr('Иванов Иван Иванович', ' ', 2) -1)
 from dual

на Тофик газах не работает правда(
15 апр 09, 08:48    [7064646]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 405
Спасибо
15 апр 09, 09:24    [7064728]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49205
Row#FAM||''||IMA||''||OTH
1Абасов Фархад Фикрет-Оглы
2Аблязов Рустем
3Бахшалиев Афик Зульфали оглы
4Булина-Зыкина Елена Андреевна
5Габибов Арзу Камил-оглы
6Зейналов Эльмар Джамал_оглы
7Исмаилов Заур Абульфат_оглы
8Мамедов Эльдар Насиб_оглы
9Рагимов Рауф Афис-оглы
10Рагимов Рафик Афис-оглы
11Самофалов-Зорин Артем Маркович
12Сариев Махаббат Эльдар-Оглы
13Тагиев Рагим Надир оглы
14Тульнова Гюльнара Ахмедага кизы
15Ханмамедова Дуня Тофик-гизы
16Эль_гуэссаб Любовь Валерьевна
кстати, насколько я понял, "Эль_гуэссаб" - фамилия из двух слов, просто всё-таки пришлось вставить "_"
15 апр 09, 09:42    [7064817]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
andreymx
Row#tFAM||''||IMA||''||OTH
1tАбасов Фархад Фикрет-Оглы
2tАблязов Рустем
3tБахшалиев Афик Зульфали оглы
4tБулина-Зыкина Елена Андреевна
5tГабибов Арзу Камил-оглы
6tЗейналов Эльмар Джамал_оглы
7tИсмаилов Заур Абульфат_оглы
8tМамедов Эльдар Насиб_оглы
9tРагимов Рауф Афис-оглы
10tРагимов Рафик Афис-оглы
11tСамофалов-Зорин Артем Маркович
12tСариев Махаббат Эльдар-Оглы
13tТагиев Рагим Надир оглы
14tТульнова Гюльнара Ахмедага кизы
15tХанмамедова Дуня Тофик-гизы
16tЭль_гуэссаб Любовь Валерьевна
кстати, насколько я понял, "Эль_гуэссаб" - фамилия из двух слов, просто всё-таки пришлось вставить "_"


Мне почему-то в таких случаях вспоминается голладский футболист Ян Венегоор оф Хесселинк)
15 апр 09, 09:47    [7064853]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
А вообще в шикарных системах для хранения ФИО отводится 4 поля минимум.
ФИО, Ф, И и О. Некоторые еще и на падежи не скупятся
15 апр 09, 09:48    [7064864]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1162
У нас есть работник Альвард Анвар Али Абдо
И где у него имя, фамилия, отчество?
15 апр 09, 09:52    [7064900]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
__vvp_
У нас есть работник Альвард Анвар Али Абдо
И где у него имя, фамилия, отчество?


Во блин, понаехали...
Хотя... Если по дефолту взять пробел как делимитер, то уже кадрам придется решать Анвар-Али он или Али-Абдо
15 апр 09, 10:06    [7064994]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9664
ФИО это СССРное, у других товарищей может быть ИФ, И1И2И3...ИNФ,
И1И2И3...ИN и прочие вариации :)
15 апр 09, 10:08    [7065021]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
stax..
Guest
Павел Гужанов,

Бендер Остап Сулейман -Берта-Мария Ибрагимович
15 апр 09, 10:09    [7065025]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19719
stax..
Павел Гужанов,

Бендер Остап Сулейман -Берта-Мария Ибрагимович


Да, я тоже его сразу вспоминаю в подобных случаях :)
Только мне почему-то казалось, что ...Мария Бендер-бей :)
15 апр 09, 10:34    [7065200]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
Mexico
Member

Откуда: Мексика
Сообщений: 209
и как на счеть двойная фамилия или имя как в испано-говорящи страна?

кстати не навижу constraint в поле "Отчество" NOT NULL :)
----------------------------------------------
Sorry, my Russian is not as good as my Spanish
15 апр 09, 10:41    [7065262]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 100640
Mexico
и как на счеть двойная фамилия или имя как в испано-говорящи страна?

кстати не навижу constraint в поле "Отчество" NOT NULL :)


Фамилия ? Хансен
Имя ? Билл
Отчество ? Я не знаю....у него нет отчества
(С) Осенний марафон

15 апр 09, 10:46    [7065306]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
dmidek
Mexico
и как на счеть двойная фамилия или имя как в испано-говорящи страна?

кстати не навижу constraint в поле "Отчество" NOT NULL :)


Фамилия ? Хансен
Имя ? Билл
Отчество ? Я не знаю....у него нет отчества
(С) Осенний марафон



Кадровики придумают)) Как обойти констрейнт)))
15 апр 09, 10:48    [7065329]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
Mexico
Member

Откуда: Мексика
Сообщений: 209
SQLap
dmidek
Mexico
и как на счеть двойная фамилия или имя как в испано-говорящи страна?

кстати не навижу constraint в поле "Отчество" NOT NULL :)


Фамилия ? Хансен
Имя ? Билл
Отчество ? Я не знаю....у него нет отчества
(С) Осенний марафон



Кадровики придумают)) Как обойти констрейнт)))


Главное, в Домовой книги у меня : Отчество : НЕТ, думаю был лучше Нетович!!!
15 апр 09, 11:18    [7065625]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
-=APS=-
Member

Откуда: Киев
Сообщений: 737
__vvp_
У нас есть работник Альвард Анвар Али Абдо
И где у него имя, фамилия, отчество?

Аналогичная ситуация.. Принимающая система когда-то была заточена под 3 реквизита: фамилия, имя, отчество. А поступают данные в одном поле в произвольном порядке и часто в реальной жизни приходится регистрировать для обслуживания людей, у которых с ФИО не все так однозначно. Например, Dong Canh Trung (Вьетнам), или Aza Ocana Emiliano de la Cruz (Испания) и т.п. Правда, бухгалтерия поднялась на более высокий уровень абстракции и заявила, что им пофигу, что там имя, а что - фамилия, и где они хранятся в БД. Для них важно, чтобы реквизиты в платежное поручение попадали без искажений :)
15 апр 09, 11:22    [7065657]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9664
-=APS=-
Для них важно, чтобы реквизиты в платежное поручение попадали без искажений :)

Главное, что бы совпадало с удостоверяющим личность документом и прочими
государственными записями :)
15 апр 09, 11:44    [7065912]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
citrix
Member

Откуда:
Сообщений: 159
Сразу вспомнилась знакомая девочка Марина Елена Николаевна... в фамилии Марина ударение на последний слог:-)

Нам нужен мир. Желательно весь.
15 апр 09, 12:32    [7066370]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
valerytin
Member [заблокирован]

Откуда: Moscow
Сообщений: 146
function getw(
-- возврат no-го слова из строки с параметрическим списком разделителей
-- valerytin, hexcept@narod.ru, apr-2006
  p_str varchar2, -- входящая строка
  p_num pls_integer:=1, -- слово по счету: >0 - от начала, <0 - с конца
  fstr varchar2:= -- список "пробелов" по умолчанию
   ' ~!@#$%^*()+=;:?,./\|[]{}"<>-_№'||chr(9)||chr(10)||chr(13)||chr(38)||chr(39)||
   chr(147)||chr(148)||chr(171)||chr(187)||chr(96)
 ) return varchar2 is
 l_str varchar2(2000);
 l_dev char:=chr(7); -- chr(7): возможность не указывать пробел в fstr
begin
 if p_str is null or p_num=0 then return null; end if;
 l_str:=
  ltrim(translate(p_str,l_dev||fstr,rpad(l_dev,80,l_dev)),l_dev);
 if l_str is null then return null; end if;
 if p_num>0 then -- если ищем от начала строки
  l_str:=ltrim(l_str,l_dev)||l_dev;
  for i in 2..p_num loop
   l_str:=ltrim(substr(l_str,instr(l_str,l_dev)),l_dev);
  end loop;
  return substr(l_str,1,instr(l_str,l_dev)-1);
 else -- ищем с конца
  l_str:=l_dev||rtrim(l_str,l_dev);
  for i in 2..-p_num loop
   l_str:=rtrim(substr(l_str,1,instr(l_str,l_dev,-1)),l_dev);
  end loop;
  return substr(l_str,instr(l_str,l_dev,-1)+1);
 end if;
 return null;
end getw;
--------------------------------------------------------------------------------
select
 getw(s,1,' ') fa,
 getw(s,2,' ') im,
 decode(getw(s,2,' '),null,null,
  decode(getw(s,3,' '),null,null,
  trim(substr(' '||s||' ',instr(' '||s||' ',' '||getw(s,3,' ')||' '))))) ot
from
(
 select '      Абасов Фархад Фикрет-Оглы' s from dual union all
 select 'Аблязов Рустем ' s from dual union all
 select 'Бахшалиев Афик Зульфали оглы' s from dual union all
 select 'Булина-Зыкина   Елена Андреевна          ' s from dual union all
 select 'Эль_гуэссаб Любовь Валерьевна' s from dual union all
 select 'Али-Абдо' s from dual union all
 select 'Фамилиев Али-Абдо' s from dual union all
 select 'Фамилиев Али-Абдо Отчествевич' s from dual union all
 select 'Фамилиев Али-Абдо Отчествевич + бла-бла бла' s from dual union all
 select 'Бендер Остап Сулейман -Берта-Мария Ибрагимович ' s from dual
)
15 апр 09, 12:42    [7066498]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7800
SQLap
select substr('Иванов Иван Иванович', 1, instr('Иванов Иван Иванович', ' ')),
       substr('Иванов Иван Иванович', instr('Иванов Иван Иванович', ' ',2), instr('Иванов Иван Иванович', ' ',2) -1),
       substr('Иванов Иван Иванович', -instr('Иванов Иван Иванович', ' ', 2) -1)
 from dual

на Тофик газах не работает правда(

Оно и не "на Тофик газах" работает только на 1/3... :-)
select '"'||substr('Иванов Иван Иванович', 1, instr('Иванов Иван Иванович', ' '))||'"' AS f,
       '"'||substr('Иванов Иван Иванович', instr('Иванов Иван Иванович', ' ',2), instr('Иванов Иван Иванович', ' ',2) -1)||'"' AS i,
       '"'||substr('Иванов Иван Иванович', -instr('Иванов Иван Иванович', ' ', 2) -1)||'"' AS o
from dual

F         I        O
--------- -------- ----------
"Иванов " " Иван " "Иванович"
       ^   ^    ^
ТщательнЕе надо кодировать...
15 апр 09, 13:26    [7066932]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
SQL*Plus

ТщательнЕе надо кодировать...


Согласен, повинен смерти
select substr('Иванов Иван Иванович', 1, instr('Иванов Иван Иванович', ' ') -1) F,
       substr('Иванов Иван Иванович', instr('Иванов Иван Иванович', ' ',2) + 1, instr('Иванов Иван Иванович', ' ',2) -3) I,
       substr('Иванов Иван Иванович', -instr('Иванов Иван Иванович', ' ', 2) -1) O
 from dual
15 апр 09, 13:39    [7067067]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить ФИО на Ф, И, О?  [new]
Alexey I Sereda
Member

Откуда:
Сообщений: 1
select 'Фамилия Имя Отчество'
,regexp_replace('Фамилия Имя Отчество','(.*) (.*) (.*)','\1') as f
,regexp_replace('Фамилия Имя Отчество','(.*) (.*) (.*)','\2') as i
,regexp_replace('Фамилия Имя Отчество','(.*) (.*) (.*)','\3')as o
from dual

Oracle 10.2.0.2 (в 9.2.0.5 говорят тоже работало)
По поводу регулярных выражений хорошая и небольшая статья:
http://www.interface.ru/home.asp?artId=19744
15 апр 09, 16:58    [7068847]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить