子选择时,PostgreSQL列不存在
我有一个名为user的表,我需要获得一个特定距离范围内的其他用户以及他们之间的距离。我的问题是:子选择时,PostgreSQL列不存在,postgresql,Postgresql,我有一个名为user的表,我需要获得一个特定距离范围内的其他用户以及他们之间的距离。我的问题是: select ( 6371 * acos( cos( radians(users.latitude) ) * cos( radians(-22.9035) ) * cos( radians(-43.2096) - radians(users.longitude) ) + sin
select ( 6371 * acos(
cos( radians(users.latitude) )
* cos( radians(-22.9035) )
* cos( radians(-43.2096) - radians(users.longitude) )
+ sin( radians(users.latitude) )
* sin( radians(-22.9035) )
)
) as distance, users from users where users.id != 41 and distance > 50
我需要恢复用户列表和距离,但“作为距离”不起作用:
ERROR: column "distance" does not exist.
我试过:
with distance as (
select ( 6371 * acos(
cos( radians(users.latitude) )
* cos( radians(-22.9035) )
* cos( radians(-43.2096) - radians(users.longitude) )
+ sin( radians(users.latitude) )
* sin( radians(-22.9035) )
)
) from users
)
select * from users where users.id != 41 and distance > 50
但是,错误保持不变。在Postgres中,不能在where子句中使用列别名。这就是为什么您的第一个查询不起作用 可以使用CTE进行第二次查询,但
距离
是一个虚拟表,而不是一列。加入它
with users_distance as (
select
id,
( 6371 * acos(
cos( radians(users.latitude) )
* cos( radians(-22.9035) )
* cos( radians(-43.2096) - radians(users.longitude) )
+ sin( radians(users.latitude) )
* sin( radians(-22.9035) )
)
) as distance
from users
)
select *
from users
join users_distance ud on users.id = ud.id
where users.id != 41 and ud.distance > 50
如果你做了很多,考虑把A添加到表中,这样你就不用一直重新计算它。
alter table users add column distance numeric
generated always as (
6371 * acos(
cos( radians(users.latitude) )
* cos( radians(-22.9035) )
* cos( radians(-43.2096) - radians(users.longitude) )
+ sin( radians(users.latitude) )
* sin( radians(-22.9035) )
)
) stored
最后,与其自己做这些计算,不如考虑使用非常强大的扩展。