按自定义命名行排序

时间:2013-01-07 09:55:09

标签: postgresql

我想通过一些花哨的排名函数对postgres结果进行排序,但为了简单起见,我们假设我想添加两个自定义行并按它们排序。

SELECT my_table.*,
  extract(epoch from (age(current_date, '2012-09-12 10:43:40'::date)))/3600 AS age_in_hours
  Fancy_function_counting_distance() AS distance
FROM my_table
ORDER BY distance + age_in_hours;

但是,它不起作用,因为我收到错误:ERROR: column "distance" does not exist。 是否可以按自定义命名行排序我的结果?

我正在运行postgres 9.1.x

1 个答案:

答案 0 :(得分:3)

根据SQL标准,SELECT列表中的别名在ORDER BY中不可见。

您可以使用列位置规范(例如ORDER BY 1,2),但不接受表达式;例如,你不能ORDER BY 1+2。因此,您需要使用子查询生成结果集,然后在外部查询中对其进行排序:

SELECT *
FROM (
  SELECT my_table.*,
    extract(epoch from (age(current_date, '2012-09-12 10:43:40'::date)))/3600 AS age_in_hours
    Fancy_function_counting_distance() AS distance
  FROM my_table
) x
ORDER BY distance + age_in_hours;