我是 PostgreSQL 的新手,但我对 MySQL 有一些经验。
Postgres 向我显示错误 - COLUMN 不存在,但这是由 AS 创建的“虚拟列”。
代码,在 MySQL 中运行良好:
SELECT place.*, 3956 * 2 * ASIN(SQRT( POWER(SIN((place.lattitude - $1) * pi() / 180 / 2), 2) + COS($2 * pi() / 180) * COS(place.lattitude * pi() / 180) *POWER(SIN(($3 - place.longitude) * pi() / 180 / 2), 2) )) AS "distance" FROM place WHERE place.longitude BETWEEN $4 AND $5 AND place.lattitude BETWEEN $6 AND $7 HAVING "distance" < $8 ORDER BY "distance" LIMIT 10
但是 Postgres 显示“距离”列不存在。
我怎样才能重写它? (请编写完整的 SQL 查询,而不是“如何”)
$number 是可变的(针对 SQL 注入(inject))
谢谢
最佳答案
使用子查询:
SELECT p.*
FROM (SELECT place.*, 3956 * 2 * ASIN(SQRT( POWER(SIN((place.lattitude - $1) * pi() / 180 / 2), 2) + COS($2 * pi() / 180) * COS(place.lattitude * pi() / 180) *POWER(SIN(($3 - place.longitude) * pi() / 180 / 2), 2) )) AS "distance"
FROM place
WHERE place.longitude BETWEEN $4 AND $5 AND
place.lattitude BETWEEN $6 AND $7
) p
WHERE "distance" < $8
ORDER BY "distance"
LIMIT 10;
您不想在 MySQL 中使用子查询,因为它会具体化中间结果。其他数据库在优化查询的方式上更为智能,并且不一定具体化子查询。
关于mysql - PostgreSQL - 列不存在(WHERE with AS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756787/