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

Откуда:
Сообщений: 270
Здравствуйте.

Имееются две таблицы:
table1 (town c(40),street c(40))
table2 (town c(40),street c(40))

Данные table1:

Town Street
Москва г Первая ул

Данные table2:

Town Street
г.Москва ул.Первая

Как сравнить эти таблицы только по названию?
Пробовал делать так:

local lcTownTable1
lcTownTable1="г"

local lcStreetTable1
lcStreetTable1="ул"

local lcTownTable2
lcTownTable2="г."

local lcStreetTable2
lcStreetTable2="ул."

locate for chrtran(chrtran(table1.town,"m.lcTownTable1","")," ","")==chrtran(chrtran(table2.town,"m.lcTownTable2","")," ","") and;
chrtran(chrtran(table1.street,"m.lcStreetTable1","")," ","")==chrtran(chrtran(table2.street,"m.lcStreetTable2","")," ","")
23 сен 09, 12:08    [7696914]     Ответить | Цитировать Сообщить модератору
 Re: Как такое можно реализовать?  [new]
ухыч
Guest
ping_09
Здравствуйте.
Данные table1:
Town Street
Москва г Первая ул

Данные table2:
Town Street
г.Москва ул.Первая

Как сравнить эти таблицы только по названию?

Если позиции сокращения города и улицы по каждой из таблиц представленны именно так как дано в данных и не гуляют,то можно попробовать так:

select a.*.b.*
from table1 a,table2 b
where LEFT(a.town,ATC(' г ',a.town)-1)=substr(b.town,ATC('г.',b.town)+2) 
and LEFT(a.street,ATC(' ул ',a.street)-1)=substr(b.street,ATC('ул.',b.street)+2) 
23 сен 09, 13:17    [7697348]     Ответить | Цитировать Сообщить модератору
 Re: Как такое можно реализовать?  [new]
ухыч
Guest
select a.*.b.*
from table1 a,table2 b
where LEFT(a.town,ATC(' г ',a.town)-1)=substr(b.town,ATC('г.',b.town)+2) 
and LEFT(a.street,ATC(' ул ',a.street)-1)=substr(b.street,ATC('ул.',b.street)+3) 
23 сен 09, 13:18    [7697360]     Ответить | Цитировать Сообщить модератору
 Re: Как такое можно реализовать?  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Это все частные случаи.
Например ATC(' г ',a.town)-1 = -1 если ' г ' вообще не будет. и LEFT(a.town,ATC(' г ',a.town)-1) даст пустую строку.

Лучше сначала привести один из справочников к виду второго.
Скопировать в курсор и причесать чтобы ' г ' стояла с одной стороны.

Совсем выкидывать 'г' и 'ул' не надо, у них смысловая нагрузка есть.
Где гарантия что нет в одном городе "ул. Ленина" и "пр. Ленина" ?
23 сен 09, 13:39    [7697461]     Ответить | Цитировать Сообщить модератору
 Re: Как такое можно реализовать?  [new]
ухыч
Guest
Dima T
Это все частные случаи.
Например ATC(' г ',a.town)-1 = -1 если ' г ' вообще не будет. и LEFT(a.town,ATC(' г ',a.town)-1) даст пустую строку.

Лучше сначала привести один из справочников к виду второго.
Скопировать в курсор и причесать чтобы ' г ' стояла с одной стороны.

Совсем выкидывать 'г' и 'ул' не надо, у них смысловая нагрузка есть.
Где гарантия что нет в одном городе "ул. Ленина" и "пр. Ленина" ?

+
поместить бы эту смысловую нагрузку в отдельное поле:
tip_street:
г-город
ул-улица
пр-проспект
...
23 сен 09, 15:18    [7698161]     Ответить | Цитировать Сообщить модератору
 Re: Как такое можно реализовать?  [new]
igorbik
Member

Откуда: Мск
Сообщений: 578
ping_09,

Для целей сравнения попробуйте использовать оператор вхождения подстроки в строку "$"
Например
IF 'Москва' $ table1.town AND 'Москва' $ table2.town THEN... ENDIF
или
IF 'Первая' $ table1.street AND 'Первая' $ table2.street THEN... ENDIF
или
IF 'Москва' $ table1.town AND 'Первая' $ table1.street THEN... ENDIF
и т.п.
23 сен 09, 18:36    [7699626]     Ответить | Цитировать Сообщить модератору
 Re: Как такое можно реализовать?  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
Мне кажется, все это пустая затея. Изначально разнородный вид хранения города/улицы делает затруднительным уверенное определение соответствия.
По словам автора :

Данные table1:
Town Street
Москва г Первая ул

Данные table2:
Town Street
г.Москва ул.Первая


Если во второй таблице после "г" и "ул" есть хотя бы точка, то в первой таблице эти признаки города и улицы просто окружены пробелами. Вроде бы, хотя где гарантия, что оператор не поленился и поставил точку (во 2-й таблице) и поставил пробелы (в 1-й). Как искать соответствие в таком примере :

Данные table1:
Town Street
Львов г Светлая ул

Данные table2:
Town Street
дер.Светлая наб.Львовская


И таких частных случаев можно придумать еще миллион. Найти вхождение подстроки из одной таблицы в строку другой таблицы - не есть проблема. Проблема в точном определении, где город (и точно-ли тот) и где улица (и точно-ли именно та).
23 сен 09, 19:32    [7699830]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить