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

Posted

技术标签:

【中文标题】如何在 PostgreSQL ORDER BY 子句中使用别名?【英文标题】:How to use an ALIAS in a PostgreSQL ORDER BY clause? 【发布时间】:2012-08-02 20:55:20 【问题描述】:

我有以下疑问:

SELECT 
    title, 
    (stock_one + stock_two) AS global_stock
FROM
    product
ORDER BY
    global_stock = 0,
    title;

在 PostgreSQL 8.1.23 中运行它我得到这个错误:

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

任何人都可以帮我把它付诸实践吗?我首先需要可用的项目,然后是不可用的项目。非常感谢!

【问题讨论】:

Postgres 8.1?您应该立即升级 @a_horse_with_no_name,我正在尝试,我的主机现在只有这个版本。感谢您的建议! 那么你应该改变你的主机。 8.1 已经停止支持 2 年多了。 @a_horse_with_no_name,我会试试,顺便问一下,你有没有更新 Postgres 的好主机的建议?现在我正在使用Bounceweb (Brazil) 【参考方案1】:

您总是可以通过这种方式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

【讨论】:

你拯救了我的一天!我使用了第一个选项,这对我来说会更容易!非常感谢! 你能告诉我第二个选项是否比第一个慢得多吗?我在使用第一个解决方案时遇到了分页问题,​​因为我使用的是 LIMIT 子句。 肮脏的把戏(按 2,1 的顺序),但如果它有效,它有效 :) 非常感谢 @Noobgrammer Yuck,这是一个非常古老的答案,我不会再建议order by 2, 1。 :) @bluefeet 好的。谢谢你。我不认为它会工作。我认为COALESCE(2, 1) 总是会评估为2,使其等同于ORDER BY 2。无论如何,不​​要紧。就我而言,我认为将COALESCE(MAX(c.created), p.created) AS posted_at 添加到SELECT 之后的列列表中,然后添加ORDER BY posted_at DESC 实际上效果更好。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果有人在谷歌搜索你是否可以ORDER BY my_alias 时发现这个:是的,你可以。这花了我几个小时。

作为postgres docs 状态:

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

所以要么这个问题已经得到解决,要么这个问题专门针对我实际上并不需要的 ORDER BY my_alias = 0, other_column 语法。

【讨论】:

以上是关于如何在 PostgreSQL ORDER BY 子句中使用别名?的主要内容,如果未能解决你的问题,请参考以下文章

order by 在 POSTGRESQL 中的 partition by 子句中不起作用?

PostgreSQL ORDER BY 语句

PostgreSQL ORDER BY 语句

PostgreSQL order by 排序问题

PostgreSQL 可以在 ORDER BY 中使用 FOR LOOP 吗?

Postgresql ORDER BY - 选择正确的索引