如何在 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 子句中不起作用?