postgres `order by` 参数类型

ove*_*awn 3 postgresql sql-order-by

order byPostgresql 中子句的参数类型是什么?

我遇到了一个非常奇怪的行为(使用 Postgresql 9.5)。即,查询

select * from unnest(array[1,4,3,2]) as x order by 1;
Run Code Online (Sandbox Code Playgroud)

1,2,3,4按预期生产。然而查询

select * from unnest(array[1,4,3,2]) as x order by 1::int;
Run Code Online (Sandbox Code Playgroud)

产生1,4,3,2,这看起来很奇怪。同样,每当我1::int用任何函数(例如greatest(0,1))甚至case运算符替换时,结果都是无序的(与我所期望的相反)。

那么参数应该具有哪种类型order by,以及如何获得预期的行为?

a_h*_*ame 8

这是预期的(并记录在案的)行为:

Asort_expression也可以是输出列的列标签或编号

所以表达式:

order by 1
Run Code Online (Sandbox Code Playgroud)

按结果集的第一列排序(由 SQL 标准定义)

然而表达式:

order by 1::int
Run Code Online (Sandbox Code Playgroud)

按常量值排序1,它本质上与:

order by 'foo'
Run Code Online (Sandbox Code Playgroud)

通过对order by所有行使用常量值,它们具有相同的排序值,因此并未真正排序。

要按表达式排序,只需使用:

order by 
    case 
       when some_column = 'foo' then 1
       when some_column = 'bar' then 2
       else 3
    end
Run Code Online (Sandbox Code Playgroud)

以上根据表达式的结果对结果进行排序case