续集:PG :: UndefinedColumn:错误:列“距离”不存在

时间:2019-09-15 06:27:09

标签: sql ruby postgresql sequel

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

['1600', '1601']
['1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998']
['2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010']
['2012', '2013', '2014', '2015']

运行此命令后:

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:错误:列“距离”不存在。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您使用的查询是从MySQL挖走的,可以在HAVING子句中使用选择别名。但是在Postgres中,您将必须子查询或仅重复距离公式。以后一个选项为例,这是Haversine查询的一个可行版本:

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;

答案 1 :(得分:0)

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;