Модераторы: Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разложить ФИО в три столбца, Разложить ФИО в три столбца 
V
    Опции темы
password
Дата 31.1.2013, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: нет
Всего: 8



Добрый вечер.

Вопрос знатокам.
База FireBird 2.5

Таблица (назовём её например reg_doc) имеет значения:
Код

row_id    FIO
1            Иванов
2            Иванов Иван Иванович
3            Иванов И.И.
4            Иванов И.


FIO могут быть как через пробел (наиболее встречаемый вариант), но могут быть сокращенно через "."
Для определенной выгрузки данных нужно разбить FIO на Фамилию, Имя, Отчество по отдельным столбцам. Немного посидел написал такой sql. Можно ли его немного упростить, или данный вариант оптимальный?

Код

SELECT row_id,
       fio,
       substring(fio from 1 for position(' ' in fio)) name1, -- Вырезаю Фамилию
       substring(substring(fio from position(' ' in fio)+1) from 1 for position(' ' in substring(fio from position(' ' in fio)+1))) name2, -- Вырезаю Имя
       substring(fio from position(' ' in fio)+1+position(' ' in substring(fio from position(' ' in fio)+1))) name3 -- Вырезаю Отчество
FROM
  (select row_id, replace(replace(fio,',',' '),'.',' ')||' ' fio from  reg_doc)  -- Заменяю ".", "," на " ", дальше работаю только с пробелами




PM MAIL Skype   Вверх
xackera
Дата 20.3.2013, 12:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.6.2008
Где: USSR

Репутация: нет
Всего: нет



Вариант вроде нормальный. Но что мешало сделать разбивку ФИО на три поля и уже в запросе их склеивать в одно?
PM MAIL WWW ICQ GTalk   Вверх
Akina
Дата 20.3.2013, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Ты учитываешь возможность наличия пробела после точки или там двух пробелов после фамилии?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Данкинг
Дата 20.3.2013, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



А если в БД будет Абдулхаков Зиннур Фаррух Рашид-Оглы ?

Это сообщение отредактировал(а) Данкинг - 20.3.2013, 18:27


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
password
Дата 20.3.2013, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: нет
Всего: 8



xackera, программа уже была практически написана, переписывать не хотелось. А на завершающем этапе нужно было сравнивать с другой БД, где ФИО представлено как три поля. 

Akina, хорошее замечание. Нужно будет добавить еще один репласе (2 пробела на один), что то типа этого:
replace(replace(replace(fio,',',' '),'.',' '), '  ',' ')

Данкинг, Всех вариантов тоже не предусмотреть, я согласен и не на 100% совпадений, тем более человеческий фактор работает, и фамилии они не правильно пишут, не делать же еще выбор Фамилий, Имен и Отчеств из справочников...
Остальные же просто выпадают в отдельный список на ручной разбор полетов )))

Всем спасибо за качественные замечания, тему отмечаю как решенную )
PM MAIL Skype   Вверх
Radekk
Дата 28.5.2013, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 11.4.2013

Репутация: нет
Всего: нет



Близко очень к моему вопросу, поэтому задам здесь

Firebird 1.5

в поле таблицы базы данных содержатся строки, например:

дракон огнедышаший
дырокол
дьякон вечно молящийся
просто текст
дермантин китайский
дихлорэтан 
пакистан дагестан 
димон шмель
Чарльз Дарвин
дарданеллы
Дейнерис Таргариен
и т.д.

в строках не содержатся дефисы и прочие знаки препинания, строки начинаются и заканчиваются пробелами, а все буквы upper case.
не могу никак составить sql запрос, через "like" чтобы выбрать все строки в которых содержатся слова начинающиеся на "д" и заканчивающиеся на "н"
при запросе типа like "% Д[^ ]%Н %" вообще ничего не отображается, уже с ума схожу, хотел регулярками но сервер не поддерживает.
может подскажете что???

PM MAIL   Вверх
Данкинг
Дата 28.5.2013, 10:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



Цитата(Radekk @  28.5.2013,  08:49 Найти цитируемый пост)
Близко очень к моему вопросу, поэтому задам здесь

Я бы не сказал, что близко, но пусть будет близко.
Код

select * from table where left(pole,1)='Д' and substring(pole from char_length(trim(pole)) for 1)='Н'



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Radekk
Дата 28.5.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 11.4.2013

Репутация: нет
Всего: нет



Цитата(Данкинг @ 28.5.2013,  10:33)
Цитата(Radekk @  28.5.2013,  08:49 Найти цитируемый пост)
Близко очень к моему вопросу, поэтому задам здесь

Я бы не сказал, что близко, но пусть будет близко.
Код

select * from table where left(pole,1)='Д' and substring(pole from char_length(trim(pole)) for 1)='Н'

Спасибо огромное.
К сожалению в 1.5 не работает Left()....
Similar to так же не работает, поэтому мучения адские....
Пока решил добавлением запроса который вытягивает как можно больше записей и сижу уже в коде фильтрую регулярками пока что..... Но это не айс решение, а костыли...

Это сообщение отредактировал(а) Radekk - 28.5.2013, 14:25
PM MAIL   Вверх
Данкинг
Дата 28.5.2013, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



Цитата(Radekk @  28.5.2013,  15:24 Найти цитируемый пост)
К сожалению в 1.5 не работает Left()....

А substring работает? Тогда можно и его заюзать.
Цитата(Radekk @  28.5.2013,  15:24 Найти цитируемый пост)
Similar to так же не работает

Какой similar?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Radekk
Дата 29.5.2013, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 11.4.2013

Репутация: нет
Всего: нет



Цитата(Данкинг @ 28.5.2013,  20:15)
Цитата(Radekk @  28.5.2013,  15:24 Найти цитируемый пост)
К сожалению в 1.5 не работает Left()....

А substring работает? Тогда можно и его заюзать.
Цитата(Radekk @  28.5.2013,  15:24 Найти цитируемый пост)
Similar to так же не работает

Какой similar?

substring работает, но опять же 

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 70.
char_length.

может есть что то кроме char_length чтоб можно было работать?
длинну слов в строке я не знаю, поэтому даже ума не приложу как ее можно разбить на подстроки, может какую процедуру написать чтоб она выборку проверяла? не подскажете?
хочется нормальную выборку делать сразу в бд, чтобы потом не писать лишний код с никому не нужными перепроверками.

Similar to
PM MAIL   Вверх
Akella
Дата 29.5.2013, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(Radekk @  28.5.2013,  07:49 Найти цитируемый пост)
не могу никак составить sql запрос, через "like" чтобы выбрать все строки в которых содержатся слова начинающиеся на "д" и заканчивающиеся на "н"


Код
where pole1 like ' Д%' and pole1 like '%Н '

PM MAIL   Вверх
Radekk
Дата 30.5.2013, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 11.4.2013

Репутация: нет
Всего: нет



Цитата(Akella @  29.5.2013,  12:08 Найти цитируемый пост)
код SQL


так он мне вытягивает все строки начинающиеся на "Д" и заканчивающиеся на "Н"
 вместо:
Чарльз Дарвин

он вытягивает:
Дейнерис Таргариен

я посмотрел в базу импортированы UDF - rFunc UDF Library 
там есть функция наподобие "char_length" однако она не возвращает никаких данных и пользоваться ей толком не получается...
буду пытаться упросить начальство обновить базу данных до 2.5, но боюсь шансов у меня маловато.

PM MAIL   Вверх
Akella
Дата 30.5.2013, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(Radekk @  30.5.2013,  07:40 Найти цитируемый пост)
так он мне вытягивает все строки начинающиеся на "Д" и заканчивающиеся на "Н"
 вместо:
Чарльз Дарвин

он вытягивает:
Дейнерис Таргариен


покажи свой код
PM MAIL   Вверх
Radekk
Дата 31.5.2013, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 11.4.2013

Репутация: нет
Всего: нет



Код

select distinct SEARCH_VIEW.IDAPPLI ,ID821 , DTRECEPT, IDMARK, DTAPPLI, DENO,SIDCLASS
,SIDCATEGORY , SSOLICITANT ,idcountry,ID822 ,NMPERSON , '2' as ID_BD, stranslit,IDMARK_SORT,
 SDENO, STATUT from search_view  where ( (sdeno like ' P%' and sdeno like '%S '  or STRANSLIT like ' P%' and STRANSLIT like '%S '  )  )


выдает в результате строки:

PERFORMANCE BUILDINGS
PATOS
PACIOTTI 4US

А не  
PATOS
NEW-YORK PARIS ST.LOUIS
PM MAIL   Вверх
Akella
Дата 31.5.2013, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



мне кажется, скобки неправильно расставлены, я бы так поставил:
Код
where (sdeno like ' P%' and sdeno like '%S ' ) or (STRANSLIT like ' P%' and STRANSLIT like '%S '  )


А в твоём случае скобки вообще не нужны, можно было и так записать:
Код
where sdeno like ' P%' and sdeno like '%S '  or STRANSLIT like ' P%' and STRANSLIT like '%S '

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.