我的PostgreSQL里有两张桌子。
ZIP在两者中都是CHAR(5),但是每个ZIP都是格式:'XXXXX‘5数字。例如:“55555”或“12345”。
我要选择所有的地址与加入的ZIP。问题是,有些地址有zip,它不在ZIP表中。对于这种情况,我想要连接最近(更大)的zip值。
我为它创建了DB函数(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行(在ZIP中大约有200行),查询时间几乎是4分钟!
B计划在DB中存储两个ZIP,一个是当前的,另一个是用于连接的。
非常感谢!
发布于 2019-07-11 12:36:21
SELECT DISTINCT ON (a.city, a.street, a.zip)
*
FROM
address a
JOIN
zip z
ON a.zip <= z.zip
ORDER BY a.city, a.street, a.zip, z.zip加入所有等于或更大的拉链。然后给出每个连接地址的第一个记录。
如果zip存在:第一个合适的ZIP等于。因此,第一次订购的记录是自己的拉链。
如果zip不存在:第一个合适的ZIP是下一个更大的。
DISTINCT ON给出了有序组的第一批记录。
发布于 2019-07-13 05:47:01
您已经回答了您提出的问题,并对总体策略提出了一些评论。我只是想跳到这一点,因为,在前世,我写了一个邮编的距离计算器产品。这是伟大的,以前的互联网,但我不推荐现在。原因如下:
https://stackoverflow.com/questions/56989200
复制相似问题