Sql 续集:PG::UndefinedColumn:错误:column";“距离”;不存在

Sql 续集:PG::UndefinedColumn:错误:column";“距离”;不存在,sql,ruby,postgresql,sequel,Sql,Ruby,Postgresql,Sequel,我正在尝试使用此查询获取附近企业的列表: query = "SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM businesses HAVING distance < ? ORDER BY distan

我正在尝试使用此查询获取附近企业的列表:

query = "SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM businesses HAVING distance < ? ORDER BY distance"
我发现PG::UndefinedColumn:ERROR:列“distance”不存在

距离不是表中的一列,但我在查询中将其创建为一个计算列,因此它应该可以工作,但不是吗


有什么想法吗?

您使用的查询是从MySQL中挖出的,在MySQL中,select别名可以在
HAVING
子句中使用。但是在Postgres中,您必须要么子查询,要么只是重复距离公式。以后一个选项为例,下面是哈弗森查询的一个可行版本:

SELECT
    id,
    ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance
FROM business
WHERE
    ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) )
    < ?
ORDER BY
    distance;
选择
身份证件
(3959*acos(cos(弧度(37))*cos(弧度(lat))*cos(弧度(ln)-弧度(?)+sin(弧度(?))*sin(弧度(lat)))作为距离
从商
哪里
(3959*acos(弧度(37))*cos(弧度(纬度))*cos(弧度(lng)-弧度(?)+sin(弧度(?))*sin(弧度(纬度)))
< ?
订购人
距离;

您使用的查询是从MySQL中挖出的,在MySQL中,select别名可以在
HAVING
子句中使用。但是在Postgres中,您必须要么子查询,要么只是重复距离公式。以后一个选项为例,下面是哈弗森查询的一个可行版本:

SELECT
    id,
    ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance
FROM business
WHERE
    ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) )
    < ?
ORDER BY
    distance;
选择
身份证件
(3959*acos(cos(弧度(37))*cos(弧度(lat))*cos(弧度(ln)-弧度(?)+sin(弧度(?))*sin(弧度(lat)))作为距离
从商
哪里
(3959*acos(弧度(37))*cos(弧度(纬度))*cos(弧度(lng)-弧度(?)+sin(弧度(?))*sin(弧度(纬度)))
< ?
订购人
距离;

Postgres支持横向联接,因此您可以在不使用子查询或CTE的情况下执行此操作,如下所示:

SELECT b.id, v.distance
FROM business b CROSS JOIN LATERAL
     (VALUES ( 3959 * acos( cos( radians(37) ) * cos( radians( b.lat ) ) * cos( radians( b.lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( b.lat ) ) )
             )
     ) v(distance)
WHERE v.distance < ?
ORDER BY distance;
选择b.id,v.distance
从业务b交叉连接横向
(值(3959*acos(cos(弧度(37))*cos(弧度(b.lat))*cos(弧度(b.lng)-弧度(?)+sin(弧度(?))*sin(弧度(b.lat)))
)
)v(距离)
其中v.distance<?
按距离排序;

Postgres支持横向联接,因此您可以在不使用子查询或CTE的情况下执行此操作,如下所示:

SELECT b.id, v.distance
FROM business b CROSS JOIN LATERAL
     (VALUES ( 3959 * acos( cos( radians(37) ) * cos( radians( b.lat ) ) * cos( radians( b.lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( b.lat ) ) )
             )
     ) v(distance)
WHERE v.distance < ?
ORDER BY distance;
选择b.id,v.distance
从业务b交叉连接横向
(值(3959*acos(cos(弧度(37))*cos(弧度(b.lat))*cos(弧度(b.lng)-弧度(?)+sin(弧度(?))*sin(弧度(b.lat)))
)
)v(距离)
其中v.distance<?
按距离排序;