【问题标题】:How to use an ALIAS in a PostgreSQL ORDER BY clause?如何在 PostgreSQL ORDER BY 子句中使用别名?
【发布时间】: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)

标签: sql postgresql postgresql-8.1


【解决方案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 语法。

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2019-05-31
      相关资源
      最近更新 更多