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 關注
- 216 瀏覽
添加回答
舉報