У меня есть две таблицы в моем PostgreSQL.
- АДРЕС (улица, город, почтовый индекс)
- ZIP (zip, gps_lat, gps_long)
ZIP - CHAR (5) в обоих, но каждый ZIP имеет формат: «XXXXX» 5 цифр.Пример: «55555» или «12345».
Я хочу выбрать все АДРЕС с присоединенным ZIP.Проблема в том, что у некоторых адресов есть zip, которых нет в таблице ZIP.Для этой ситуации я хочу присоединить значение NEAREST (BIGGER).
Я создал для него функцию БД (psc == zip):
CREATE OR REPLACE FUNCTION lekari.get_psc(pscx character)
RETURNS character
LANGUAGE plpgsql
AS $function$
begin
if exists (select 1 from spravni_celky.zip where psc = pscx) then
return pscx;
end if;
while not exists (select 1 from spravni_celky.zip where psc = pscx) loop
pscx = cast(cast(pscx as integer) + 1 as char(5));
end loop;
return pscx;
end;$function$;
А затем создайте просто выберите:
select * from lekari.address lad
join spravni_celky.zip p on p.psc = lekari.get_psc(lad.psc)
Это работает, но для 12 строк в АДРЕС (и около 200 в ZIP) время запроса составляет почти 4 мин !
План B хранится в двух ZIP вБД, один текущий и один для присоединения.
Большое спасибо!