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

Откуда:
Сообщений: 44
Помогите, пожалуйста, решить задачу. Есть две таблицы, в одной есть поле FIO, содержащее данные "Иванов Иван Иванович" , "Федоров Ф.О". Вторая таблица имеет три поля First_name(Иванов, федоров), name(Иван, федор), Last_name(Иванович, Олегович). Необходимо выбрать людей с одинаковыми фамилиями в третью таблицу. можно ли это сделать с помощью LIKE и какой должна быть маска ?
например

select .... from table1, table 2 where table1. first_name like (table2. FIO маска) into dbf table3
26 сен 13, 16:07    [14888384]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Наоборот надо: "Строка в которой ищем" like "Подстрока которую ищем"
table2. FIO like (table1. first_name) and table2. FIO like (table1.name) and table2. FIO like (Last_name)

только в like проценты добавь как в прошлом топике.
26 сен 13, 16:46    [14888704]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Anastassie
Member

Откуда:
Сообщений: 44
просто проблема в том что вместо Ивана Ивановича или Федора Федоровича в поле FIO могут стоять инициалы...
26 сен 13, 17:08    [14888851]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Rostislav D. Kudryashov
Member

Откуда:
Сообщений: 237
Anastassie, попробуй, может будет польза от применения функции GetWordNum ()?
27 сен 13, 01:07    [14890582]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Anastassie
просто проблема в том что вместо Ивана Ивановича или Федора Федоровича в поле FIO могут стоять инициалы...

Тогда задача не имеет однозначного решения. Например Иванов А.А. может быть Алексеем Андреевичем, Александром Анатольевичем и т.д. Потом может быть два Иванова Алексея Андреевича.

Тут надо писать эвристический анализатор: берем одну запись из первой таблицы, разбираем (выделяя фамилию и инициалы или имя отчество), ищем все возможные варианты во второй, если во второй несколько вариантов, то предлагаем пользователю выбрать правильный. Возможно есть еще какие-то уточняющие данные (д.р., ИНН, паспорт и т.п.)
27 сен 13, 07:36    [14890736]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Rostislav D. Kudryashov
Member

Откуда:
Сообщений: 237
Dima T, не надо усложнять тему ответами на незаданные вопросы. Заданный вопрос касался только фамилий. Так что Ивановы ОДНОЗНАЧНО остаются Ивановыми независимо от их имён и отчеств.
А если ты хочешь всё-таки искать по ФИО, то с учётом того, что некоторые имена-отчества представлены в таблицах инициалами, такая задача будет не неоднозначна, а просто НЕРАЗРЕШИМА.
27 сен 13, 10:59    [14891444]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Rostislav D. Kudryashov
Dima T, не надо усложнять тему ответами на незаданные вопросы.

Немного телепатических способностей (т.е. внимательно прочитай вот это 14888851) и ты поймешь что вопрос изначально был поставлен неточно.
Сколько еще недосказано - пусть ТС уточнит.

Rostislav D. Kudryashov
Заданный вопрос касался только фамилий. Так что Ивановы ОДНОЗНАЧНО остаются Ивановыми независимо от их имён и отчеств.

Равность Ивановых можно допустить разве что при написании курсовой. В реальной жизни это недопустимо.

Rostislav D. Kudryashov
А если ты хочешь всё-таки искать по ФИО, то с учётом того, что некоторые имена-отчества представлены в таблицах инициалами, такая задача будет не неоднозначна, а просто НЕРАЗРЕШИМА.

Полное условие задачи не озвучено. Простое сведение двух списков фамилий не имеет практического смысла. На практике такое требуется для сведения однотипных справочников двух разных баз, т.е. с обоих сторон есть еще инфа связанная с конкретным ФИО.
27 сен 13, 12:45    [14892093]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
sg12
Member

Откуда:
Сообщений: 454
Anastassie
Помогите, пожалуйста, решить задачу. Есть две таблицы, в одной есть поле FIO, содержащее данные "Иванов Иван Иванович" , "Федоров Ф.О". Вторая таблица имеет три поля First_name(Иванов, федоров), name(Иван, федор), Last_name(Иванович, Олегович). Необходимо выбрать людей с одинаковыми фамилиями в третью таблицу. можно ли это сделать с помощью LIKE и какой должна быть маска ?
например

select .... from table1, table 2 where table1. first_name like (table2. FIO маска) into dbf table3


Если вам нужны только фамилии, то что мешает вам из таблиц брать только инициалы имени и отчества.
Может, вообще для вашей задачи вам достаточно сравнивать только одни фамилии.
По крайней мере, не придется вам "пИсать эвристический анализатор".
Да и с процентами LIKE - к примеру, Кай Метов и Кайметов - это разные фамилии.
27 сен 13, 13:30    [14892455]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Anastassie
Member

Откуда:
Сообщений: 44
задача и является неоднозначной, к сожалению, никаких дополнительных уникальных данных типа паспортный номер или индификационный код в таблицах нет((( просто я хотела выбрать поле с фамилиями и инициалами, и приципить к итоговой таблице имена и отчества из второй таблицы потом уже глазками сравнить совпадают имена с инициалами или нет. Самое печальное, что это не лабораторная работа , а реальная ситуация на работе. объем таблиц 5 тысяч записей и почти 50, нужно хотя бы к минимуму свести количество записей проверяемых глазами. Требуется выбрать из таблицы в 5 000 записей с полем fio всех, кто есть во второй таблице.

Почему-то у меня с маской '%' ничего не выбирается. Не могли бы Вы объяснить, каким образом она отрабатывает. Мне нужно чтобы проверялась идентичность начала одного поля с целым полем во второй таблице. Например, значение в поле FIO 'иванов и.и' или же 'петров петр олегович' со значениями поля во второй таблице fullname 'иванов' и 'петров' (во второй таблице фамилии отдельно от имен и отчеств, то есть в поле fullname отображаются фамилии,name - имена, otch - отчества)
30 сен 13, 11:16    [14900203]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Тут почитай про оператор LIKE. Там подробно с примерами.
30 сен 13, 14:07    [14901571]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Anastassie
Мне нужно чтобы проверялась идентичность начала одного поля с целым полем во второй таблице. Например, значение в поле FIO 'иванов и.и' или же 'петров петр олегович' со значениями поля во второй таблице fullname 'иванов' и 'петров' (во второй таблице фамилии отдельно от имен и отчеств, то есть в поле fullname отображаются фамилии,name - имена, otch - отчества)

Если надо только фамилии сравнить, то LIKE не нужен. Фамилия всегда пишется целиком. Надо только вытащить ее из FIO. Если фамилия всегда первым словом, то так
select .... from table1, table 2 where lower(alltrim(table1.fullname)) == lower(GetWordNum(table2.FIO, 1)) into dbf table3

инициалы как-то так можно добавить
select .... from table1, table 2 where lower(alltrim(table1.fullname)) == lower(GetWordNum(table2.FIO, 1)) and lower(left(table1.name, 1)) = lower(left(GetWordNum(table2.FIO, 2), 1) and lower(left(table1.otch, 1)) = lower(left(GetWordNum(table2.FIO, 3), 1) into dbf table3

Но вариант с инициалами может не сработать если между именем и отчеством нет пробела, например Петров В.В.
Также будут взяты инициалы от полного имени, хотя точнее сравнить по полному имени.
Поэтому лучше написать свою функцию сравнения CompareFIO(), и вызывать ее:
select .... from table1, table 2 where CompareFIO(table2.FIO, table1.fullname, table1.name, table1.otch) into dbf table3

Func CompareFIO
lpara tcFio, tcFullName, tcName, tcOtch

... Тут сравнение tcFio с tcFullName, tcName, tcOtch

if Совпало
   return .T.
else
   return .F.
endif
30 сен 13, 14:24    [14901722]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
sg12
Member

Откуда:
Сообщений: 454
Dima T

Для замены в инициалах точки на пробел в Фоксе есть функция CHRTRAN().
Также есть функция для "Compare на ходу" - IIF.
Хороший Select вы написали, почти универсальный.
30 сен 13, 16:25    [14902525]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
Rostislav D. Kudryashov
Member

Откуда:
Сообщений: 237
Anastassie, ситуация твоя довольно типична. Задача типа: поди туда, не знаю куда, принеси то, не знаю что.
Для того чтоб сравнивать данные из полей FIO с другой таблицей, неплохо разобрать FIO на составляющие. Для этого я тебе и намекал на использование функции GETWORDNUM(). Намёк оказался для тебя слишком тонок. Попробую его утолстить.

CREATE CURSOR T1 (FIO C (30))
INSERT INTO T1 (FIO) VALUES ('A B.C.')
INSERT INTO T1 (FIO) VALUES ('A C.D.')
INSERT INTO T1 (FIO) VALUES ('B C.D.')
INSERT INTO T1 (FIO) VALUES ('B D.E.')
SELECT GETWORDNUM (FIO, 1, ' .') AS F;
,GETWORDNUM (FIO, 2, ' .') AS I;
,GETWORDNUM (FIO, 3, ' .') AS O;
FROM T1 INTO CURSOR F_I_O
30 сен 13, 22:27    [14904039]     Ответить | Цитировать Сообщить модератору
 Re: частичный выбор строковых полей  [new]
sg12
Member

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

Попробуйте такое условие:
WHERE ALLTRIM(table1.фио) = ALLTRIM(table2.фамилия) + ' ' + ALLTRIM(table2.имя) + ' ' + ALLTRIM(table2.отчество) ;
OR ALLTRIM(table1.фио) = ALLTRIM(table2.фамилия) + ' ' + LEFT(table2.имя,1) + '. ' + LEFT(table2.отчество,1) + '.'

При необходимости поля таблиц предварительно обработать - PROPER(),STRTRAN(поле,'.','. '),STRTRAN(поле,' ',' ')
1 окт 13, 10:05    [14904972]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить