LINUX.ORG.RU

Как разложить адрес гар?

 


0

1

Есть допустим два идентификатора ГАР - один до улицы, второй до дома. Нужно развернуть их в таблицу по столбцам - область, район, город(село), улица, дом, корпус, квартира, адрес целиком. В гаре есть path в adm_hierarchy - там через точку указана иерархия адреса. В addr_obj есть колонка level: 1 – уровень региона 2 – уровень автономного округа (устаревшее) 3 – уровень района 35 – уровень городских и сельских поселений 4 – уровень города 5 – уровень внутригородской территории (устаревшее) 6 – уровень населенного пункта 65 – планировочная структура 7 – уровень улицы 75 – земельный участок 8 – здания, сооружения, объекта незавершенного строительства 9 – уровень помещения в пределах здания, сооружения 90 – уровень дополнительных территорий (устаревшее) 91 – уровень объектов на дополнительных территориях (устаревшее)

//донецкая респ
select name,typename,* from gar.addr_obj where level = '1' and isactual = 1 order by name
//ясиноватое
select name,typename,* from gar.addr_obj a
join gar.adm_hierarchy h on h.objectid = a.objectid
where h.parentobjid = 155815692
and isactual = 1 order by name
//нетайлово
select name,typename,* from gar.addr_obj a
join gar.adm_hierarchy h on h.objectid = a.objectid
where h.parentobjid = 155816063
and isactual = 1 order by name
//безкаравайной
select name,typename,* from gar.addr_obj a
join gar.adm_hierarchy h on h.objectid = a.objectid
where h.parentobjid = 156148609
and isactual = 1 order by name
//пусто
select name,typename,* from gar.addr_obj a
join gar.adm_hierarchy h on h.objectid = a.objectid
where h.parentobjid = 160316367
and isactual = 1 order by name
//дом
select housenum,hs.* from gar.houses hs
join gar.adm_hierarchy h on h.objectid = hs.objectid
where h.parentobjid = 160316367
and isactual = 1 order by housenum

То есть идентификатор 8faa9729-75fd-4d4b-8b6e-a1a9f82515ab например до улицы безкаравайной хранится в objectguid столбце в таблице addr_obj, в этой же строчке будет и path - 155815692.155816063.156148609.160316367 в этой же строчке будет и level для данной улицы 8. Нужно path разрезать по точкам и сделать запросы для каждого числа(objectid) к таблице addr_obj и по уровню level'а записать в таблицу



Последнее исправление: bad_master (всего исправлений: 8)

Нужно path разрезать по точкам и сделать запросы для каждого числа(objectid) к таблице addr_obj и по уровню level’а записать в таблицу

Ну разрезай и раскладывай, разрешаю.

no-dashi-v2 ★★
()

См ltree для хранения и работы с подобными структурами.

в этой же строчке будет и path - 155815692.155816063.156148609.160316367 в этой же строчке будет и level для данной улицы 8. Нужно path разрезать по точкам и сделать запросы для каждого числа(objectid) к таблице addr_obj и по уровню level’а записать в таблицу

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

посоветовали split_part но я не знаю когда последнее разрезанное число, они там переменной длины - программа падает

...
fcur.execute("select path from gar.adm_hierarchy where objectid in (select objectid from gar.addr_obj where  objectguid=%s)",[fias_aoid])
        yy = fcur.fetchone()
        if yy is not None:
            fcur.execute("select name from gar.addr_obj where objectid in (select split_part(%s,'.',1)::integer from gar.addr_obj) ",[yy])
            zz = fcur.fetchone()
            if zz is not None:
                data_ws[f'L{data_counter}'].value = zz[0]
            fcur.execute("select name from gar.addr_obj where objectid in (select split_part(%s,'.',2)::integer from gar.addr_obj) ",[yy])
            zz = fcur.fetchone()
            if zz is not None:
                data_ws[f'M{data_counter}'].value = zz[0]
            fcur.execute("select name,level from gar.addr_obj where objectid in (select split_part(%s,'.',3)::integer from gar.addr_obj) ",[yy])
            zz = fcur.fetchone()
            if zz is not None:
                data_ws[f'N{data_counter}'].value = zz[0]
                if zz[1]!=8:
                    fcur.execute("select name from gar.addr_obj where objectid in (select split_part(%s,'.',4)::integer from gar.addr_obj) ",[yy])
                    zzz = fcur.fetchone()
                    if zz is not None:
                        data_ws[f'O{data_counter}'].value = zzz[0]
...

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от bad_master

А не проще после yy = fcur.fetchone() разложить [yy] на стороне питона по точкам?

monk ★★★★★
()

сделать запросы для каждого числа(objectid) к таблице addr_obj и по уровню level’а записать в таблицу

каво именно запросы и почему чево записать?

если правильно понимаю, что вообще происходит и что лежит в таблице, ты хочешь что-то типа того

select dst.*
from gar.addr_obj as src, gar.addr_obj as dst
where
dst.objectid in unnest(string_to_array(src.path, '.'))
and src.objectguid = '8faa9729-75fd-4d4b-8b6e-a1a9f82515ab'
and dst.isactual = 1
order by dst.level
arkhnchul ★★
()
Последнее исправление: arkhnchul (всего исправлений: 1)

Мне с дивана видится что решать надо вложенными запросами:

select

from

where (select чего-то там)
Ygor ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.