如何在PostgreSQL ORDER BY子句中使用ALIAS?

时间:2012-08-02 20:55:21

标签: sql postgresql postgresql-8.1

我有以下查询:

select 
    title, 
    ( stock_one + stock_two ) as global_stock

from product

order by
    global_stock = 0,
    title;

在PostgreSQL 8.1.23中运行它我收到此错误:

查询失败:错误:列“global_stock”不存在

有人可以帮我把它投入使用吗?我首先需要可用的项目,然后是不可用的项目。非常感谢!

3 个答案:

答案 0 :(得分:13)

你总是ORDER BY这样:

select 
    title, 
    ( stock_one + stock_two ) as global_stock
from product
order by 2, 1

或将其包装在另一个SELECT中:

SELECT *
from
(
    select 
        title, 
        ( stock_one + stock_two ) as global_stock
    from product
) x
order by (case when global_stock = 0 then 1 else 0 end) desc, title

答案 1 :(得分:3)

一种解决方案是使用职位:

select  title, 
        ( stock_one + stock_two ) as global_stock
from product
order by 2, 1

但是,别名应该有效,但不一定是表达式。你是什​​么意思“global_stock = 0”?你的意思是:

select  title, 
        ( stock_one + stock_two ) as global_stock
from product
order by (case when global_stock = 0 then 1 else 0 end) desc, title

答案 2 :(得分:0)

万一有人在谷歌搜索您是否可以只ORDER BY my_alias时发现这一点:是的,您可以。这花了我几个小时。

作为 postgres docs 状态:

<块引用>

序数指的是输出列的序数(从左到右)位置。此功能可以根据没有唯一名称的列定义排序。这从来都不是绝对必要的,因为始终可以使用 AS 子句为输出列分配名称。

所以要么此问题已被修复,要么此问题专门针对我实际上并不需要的 ORDER BY my_alias = 0, other_column 语法。