mysql - PostgreSQL - 列不存在(WHERE with AS)

标签 mysql sql node.js postgresql

我是 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/

相关文章:

mysql - 在 Controller 中执行 find 指定基本条件,但 cakephp 构建的查询与条件不匹配

Mysql - 我可以查询事件(事件调度程序)的间隔吗?

两个不同(可能为空)列的 SQL 顺序

json - Mongoose:保存具有不同模式的嵌套 JSON

node.js - createBlockBlobFromText 方法的最大文本大小 Azure 存储、NodeJS

javascript - 即时创建带有策略和证书的 AWS IoT "things"

javascript - 通过node.js连接mysql时访问被拒绝

MySql 语句在 .bat 文件中不起作用,但在 MySql 中工作正常

sql - 将总计行添加到 SQL 查询的底部

sql - 在每年 12 月的第二个星期日及之后将自定义列添加到日历表中,其中包含下一年的年号