PostgreSQL:查找特定邮编附近的邮政编码

4
假设有一个包含 zip 字段的 Postgres 表,类型为 varchar(10),我想要获取所有匹配指定 zip 的结果,或在查询结果不够时扩展查询到的结果来包含与查询结果接近的记录。例如:

用户搜索 zip 为 "56500",我的查询结果返回了2项完全匹配的数据。此时,我需要执行类似于 like 查询来查找以 "565%" 开头的记录。最终,我需要在一次查询中完成上述两个需求。

请问您有什么建议吗?

3个回答

0

ORDER BY后面的差值是否为所需的zip


@HannesMaack,实际上,它仍然归结为从0开始按距离排序。问题只在于如何计算这个“距离”。 - Michael Krelin - hacker

0

所以,这不是专门针对PostgreSQL的 - 实际上它最初是为MySQL编写的 - 但应该可以工作。我一段时间前发现了这篇文章,展示了如何创建一个包含邮政编码和每个邮政编码的纬度/经度的数据库,然后使用三角函数来计算邮政编码之间的距离。看看链接吧。我相信它会对你有所帮助...

http://www.chrissibert.com/blog/2009/06/16/mysql-zip-codes-latitude-longitude-distance/


嘿,Shadowman,我不确定我是否真的需要包含纬度/经度的表格,但这是我的问题的一个好解决方案...谢谢。 - Hannes
如果您想计算邮政编码之间的距离,那么这是最好的方法。但如果您只是想获取与您搜索的邮政编码“相似”的邮政编码,则可能有些过度了。 - Shadowman
1
上面的链接现在已经失效了。这里有一个可能的替代方案:在MySQL和PostgreSQL中实现邮政编码相似函数 - Brian Clapper

0

你可能需要的是这样的:

SELECTFROM atable
WHERE zip = @zip

UNION ALL

SELECTFROM atable
WHERE NOT EXISTS (
  SELECT *
  FROM atable
  WHERE zip = @zip
)
  AND zip LIKE CONCAT(LEFT(@zip, 3), '%')

这可能不是最有效的解决方案,但至少它只需要一个查询,因此可以作为一个起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接