【问题标题】:PostgreSQL - why can't I ORDER BY a function of a column?PostgreSQL - 为什么我不能按列的函数排序?
【发布时间】:2022-10-23 13:14:33
【问题描述】:

我试图得到一些我认为应该相对简单的东西(它适用于 Oracle 和 MySQL)。以下代码的 PostgreSQL 小提琴可用here - 只需更改服务器以检查其他服务器。

非常简单的测试用例:

CREATE TABLE x
(
  y CHAR(1)
);

填充:

INSERT INTO x VALUES ('x'); 

INSERT INTO x VALUES('y');

然后(工作 - 正如人们所期望的那样):

SELECT
  y AS the_char
FROM 
  x
ORDER BY the_char;

结果:

the_char
       x
       y

但是,如果我尝试以下操作:

SELECT
  y AS the_char
FROM 
  x
ORDER BY ASCII(the_char);

我收到一个错误:

ERROR:  column "the_char" does not exist
LINE 5: ORDER BY ASCII(the_char);

如前所述,这适用于 Oracle 和 MySQL,但不适用于 PostgreSQL、Firebird 和 SQL Server。

谁能解释为什么?导致ORDER BY 失败的列的简单功能是什么?这似乎与手册 here 冲突,其中说:

排序表达式可以是任何在 查询的选择列表。一个例子是:

SELECT a, b FROM table1 ORDER BY a + b, c;

【问题讨论】:

    标签: sql postgresql sql-order-by sql-function column-alias


    【解决方案1】:

    the documentation: 中指定的简单列名以外的表达式中只能使用输入列

    每个表达式可以是输出列(SELECT 列表项)的名称或序号,也可以是由输入列值形成的任意表达式。

    另请阅读this note:

    在 SQL-92 标准中,ORDER BY 子句只能使用输出列名或数字,而 GROUP BY 子句只能使用基于输入列名的表达式。 PostgreSQL 扩展了这些条款中的每一个以允许其他选择(但如果存在歧义,它会使用标准的解释)。 PostgreSQL 还允许两个子句指定任意表达式。请注意,出现在表达式中的名称将始终被视为输入列名称,而不是输出列名称。

    【讨论】:

    • 很好的引用...
    【解决方案2】:

    如果您更仔细地阅读documentation,它会指出别名或列输出名称不能在 order by 子句中的表达式中使用。

    请注意,输出列名称必须是独立的,也就是说,它不能 用在表达式中

    SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; - 错误的

    所以,你需要

    SELECT
      y AS the_char
    FROM 
      x
    ORDER BY ASCII(y);
    

    【讨论】:

      【解决方案3】:

      一个输出列名称(如the_char)只能用作ORDER BY 子句中的普通值,但不能用作表达式的一部分;另一方面,y 可以在排序表达式中自由使用。你可以做:

      select y as the_char
      from x
      order by ascii(y)
      

      或者,您可以使用子查询来更改输出列the_char 的范围,以便可以将其作为真正的列进行管理和处理。例如:

      select *
      from (
        select y as the_char from x
      ) z
      order by ascii(the_char)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多