1 回答

TA贡献1998条经验 获得超6个赞
查询问题
SELECT DISTINCT(id) FROM steps WHERE ST_Distance('SRID=4326;POINT($1 $2)'::geography, location) < 1000
注意 $1 是 lng 而 $2 应该是 lat
为什么会发生?
'SRID=4326;POINT($1 $2)'是一个字符串文字,postgres 的序数参数占位符不应该在字符串文字中。这不是围棋的问题。这就是 postgres 处理字符串文字的方式。即'$1' != $1,一个是纯字符串,另一个是postgres(不是 Go)将替换为客户端发送到服务器的数据的参数占位符。
解决方案
..如果你想将字符串文字与参数占位符结合起来,请使用字符串连接:
ST_Distance(('SRID=4326;POINT(' || $1::text || ' ' || $2::text || ')')::geometry, location)
请注意字符串文字及其连接是如何包裹在额外的括号中的,这只是为了强制执行正确的评估顺序,即强制强制转换::geometry应用于连接后的文本。
优化
您最有可能使用st_dwithin和利用空间索引,您可以使用您的位置值和地理来构建它,他在帖子的结尾解释道。请参阅blog.cleverelephant.ca/2021/05/indexes-and-queries.html
固定 SQL 查询
SELECT DISTINCT(id) FROM steps WHERE ST_DWithin(('SRID=4326;POINT(' || $1::text || ' ' || $2::text || ')')::geometry, location, 1000);
固定围棋功能
func search(lat float32, lng float32) return (string, error){
searchQuery = "SELECT DISTINCT(id) FROM steps WHERE ST_DWithin(('SRID=4326;POINT(' || $1::text || ' ' || $2::text || ')')::geometry, location, 1000);"
// GetSession returns *pgxpool.Pool
rows, err := postgres.GetSession().Query(context.Background(), searchQuery,
lng,
lat)
if err != nil {
return nil, err
}
defer rows.Close()
...
}
- 1 回答
- 0 关注
- 195 浏览
添加回答
举报