子选择时,PostgreSQL列不存在

子选择时,PostgreSQL列不存在,postgresql,Postgresql,我有一个名为user的表,我需要获得一个特定距离范围内的其他用户以及他们之间的距离。我的问题是: select ( 6371 * acos( cos( radians(users.latitude) ) * cos( radians(-22.9035) ) * cos( radians(-43.2096) - radians(users.longitude) ) + sin

我有一个名为user的表,我需要获得一个特定距离范围内的其他用户以及他们之间的距离。我的问题是:

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

最后,与其自己做这些计算,不如考虑使用非常强大的扩展。