You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中用毕达哥拉斯定理计算距离后按邻近度排序的实现

解决方法

直接将WHERE子句中的距离平方计算表达式放到ORDER BY子句中,就能实现按邻近度排序,具体有两种实用写法:

写法1:高效排序(复用平方计算)

由于距离平方的大小顺序和实际距离的顺序完全一致,直接用平方值排序可以避免平方根计算的开销,性能更优:

SELECT * 
FROM point l 
WHERE ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) <= metres^2
ORDER BY ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) ASC;

写法2:返回实际距离并排序

如果需要在结果中直观看到每个点到目标点的具体距离,可以计算出实际距离(开平方),再按该字段排序:

SELECT *, 
       sqrt((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) AS distance_metres
FROM point l 
WHERE ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) <= metres^2
ORDER BY distance_metres ASC;

补充说明

两种写法默认都是按距离从近到远排序,若需要从远到近,把ASC改成DESC即可。

内容的提问来源于stack exchange,提问作者Varox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:06:09