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

Откуда:
Сообщений: 83
Здравствуйте, ни как не могу сообразить, в базе есть таблица, у нее одно поле FIO.
Мне нужно разбить его на 3 (F I O). Как можно это сделать? До пробелов считать?
Можете написать, как через select (например) в таблице students в поле FIO получить AS F, AS I, AS O....
22 авг 19, 20:26    [21955967]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

Rphoenix
Как можно это сделать?

В общем случае - никак. "Фарш невозможно прокрутить назад."
Дай по голове тому, кто сделал такую БД и посади делить одно поле на три ручками. Чтоб
запомнил как делать не надо.

Posted via ActualForum NNTP Server 1.5

22 авг 19, 21:02    [21955996]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Rphoenix, хм... Интересно взглянуть на алгоритм, способный правильно разобрать, к примеру, фот такое ФИО:
Пабло Диего Хозе Франциско де Паула Хуан Непомукено Криспин Криспиано де ла Сантисима Тринидад Руиз и Пикассо
22 авг 19, 21:28    [21956017]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3971
Rphoenix
Можете написать, как через select (например) в таблице students в поле FIO получить AS F, AS I, AS O....
Если простейший случай через пробелы (и они всегда есть) - теоретически можно обойтись substring и position.
Но это - вряд ли.
Как минимум придется execute block и анализировать данные лучше.

P.S. Лучше добавить в таблицу 3 поля и провести это операцию один раз. На будущее.
22 авг 19, 22:57    [21956074]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
dedRasta
Member

Откуда:
Сообщений: 142
YuRock,
У меня при получении данных из старой БД была эта проблема, но нюансы были только с товарищами с юга, у которых либо вообще не было отчества, либо оно было сложносочиненное. Но как-то разгреб.
23 авг 19, 10:00    [21956224]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
MikeDD
Member

Откуда:
Сообщений: 242
Rphoenix, берешь где-нибудь справочник имен и фамилий, загоняешь его в свою БД и на его основе парсишь свои данные. А то что останется (опечатки, экзотические имена и т.п.) придется разгребать вручную.
23 авг 19, 10:09    [21956230]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 16403
У меня есть знакомый, Александр Петрович Кузьмич (беларус). У них много таких фамилий. И разгребать, где фамилия, где отчество, придётся вручную.

Даже без сложносочинённых ничего не выйдет - FIO может оказаться IOF
23 авг 19, 10:17    [21956235]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
dvim
Member

Откуда: Санкт Петербург
Сообщений: 677
Rphoenix,

как я решал подобную задачу
1 Проход. Те у кого в ФИО есть 2 слова.
Заполняем из них Имя Фамилию
2 Проход Те у кого 3 слова - Заполняем три поля - ФИО

3 Проход Если слов 4 и больше то все лишние слова в имя (чаще всего двойные фамилии через дефис) и далее ручной контроль.
23 авг 19, 10:40    [21956261]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
Vlad F
Member

Откуда:
Сообщений: 874
Rphoenix,
1) Если совсем прижмёт, можно найти UDF-библиотеку RFunc, или что то из ее более современных клонов, и воспользоваться ее функциями WordCount(), WordNum() и т.д.
1) Если версия сервера >= 3, можно переписать эти функции на SQL в виде SDF, там всего то в каждой будет по десятку строк, я что то такое делал.
23 авг 19, 10:42    [21956267]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
KreatorXXI
Member

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

если данные ровные, то можно по-простому:
with q as (
  select a.family || ' ' || a.name || ' ' || a.otch as fio
  from sotr a
  where a.id_slug=91
)
select substring(q.fio from 1 for (position(' ', q.fio, 1) - 1)) as family,
       substring(q.fio from (position(' ', q.fio, 1) + 1) for (position(' ', q.fio, position(' ', q.fio, 1) + 1) - (position(' ', q.fio, 1) + 1))) as name1,
       substring(q.fio from (position(' ', q.fio, position(' ', q.fio, 1) + 1))) as name2,
       q.fio as fio
from q
order by 1, 2, 3
23 авг 19, 11:23    [21956316]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 16403
dvim
1 Проход. Те у кого в ФИО есть 2 слова.
Заполняем из них Имя Фамилию
А почему не Фамилию Имя?
23 авг 19, 12:31    [21956385]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 599
WildSery
dvim
1 Проход. Те у кого в ФИО есть 2 слова.
Заполняем из них Имя Фамилию
А почему не Фамилию Имя?


Я тоже задумался. Две записи:

Александр Невский
Невский Александр

И где в них фамилия?

А Владимирович - это отчество или фамилия?

+

- Рюрикович я...
- Это в смысле из нотариальной конторы "РюрикОвич и сыновья?"


rdb_dev
Rphoenix, хм... Интересно взглянуть на алгоритм, способный правильно разобрать, к примеру, фот такое ФИО:
Пабло Диего Хозе Франциско де Паула Хуан Непомукено Криспин Криспиано де ла Сантисима Тринидад Руиз и Пикассо


Вообще-то это даже для Испании патологическая редкость. У них есть такой обычай - когда родится мальчик, набрать ведро кипятку и не глядя выплеснуть в окно. Что с улицы крикнут, так мальчика и назовут. Поэтому у них все Хулио и Педры.

Такшта лучший совет

Dimitry Sibiryakov
Дай по голове тому, кто сделал такую БД и посади делить одно поле на три ручками. Чтоб
запомнил как делать не надо.


А ещё кажется мне, что это топорное задание для лабораторки :)
26 авг 19, 18:03    [21957822]     Ответить | Цитировать Сообщить модератору
 Re: Из одного поля FIO получить три  [new]
zeon11
Member

Откуда: Сибирь, Кемерово
Сообщений: 1146
Иногда приходится и с чужими БД работать.
SET TERM ^ ;

create or alter procedure AIS_PARSE_FIO (
    FIO varchar(50))
returns (
    FAM varchar(50),
    NAME varchar(50),
    PATRO varchar(50))
as
declare variable P1 integer;
declare variable L integer;
declare variable P2 integer;
declare variable IO varchar(50);
begin
     l=char_length (:fio);
     if ((:l=0) or (:fio is null)) then begin
                                          fam='';
                                          name='';
                                          patro='';
                                          suspend;
                                        end
    else begin
           p1=position (' ', :fio);
           if (:p1=0) then begin
                              fam=:fio;
                              name='';
                              patro='';
                              suspend;
                           end
                       else begin
                             fam=trim(substring(:fio from 1 for :p1));

                             io=trim(substring(:fio from :p1 for :l));

                             p2=position (' ', :io);

                             if (:p2=0) then begin
                                               name=:io;
                                               patro='';
                                             end
                                        else begin

                                         name=trim(substring(:io from 1 for :p2));
                                              l=char_length (:io);
                                 patro=trim(substring(:io from :p2 for :l));
                                 end
                              suspend;
                            end

     end
--   end
end^

SET TERM ; ^

COMMENT ON PROCEDURE AIS_PARSE_FIO IS
'Распарсить ФИО на составляющие';
28 авг 19, 12:27    [21958980]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить