对数组元素进行排序

gir*_*iri 29 postgresql

我想编写一个存储过程,它将数组作为输入参数并对该数组进行排序并返回已排序的数组.

请帮助.

Cra*_*ger 43

排序整数数组的最佳方法毫无疑问是使用intarray扩展,它将比任何SQL公式更快,更快,更快地执行:

CREATE EXTENSION intarray;

SELECT sort( ARRAY[4,3,2,1] );
Run Code Online (Sandbox Code Playgroud)

适用于任何数组类型的函数是:

CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL
AS $$
SELECT ARRAY(SELECT unnest($1) ORDER BY 1)
$$;
Run Code Online (Sandbox Code Playgroud)

(在其他地方讨论之后,我用Pavel取代了我的版本稍快一点).

  • 请记住,`unnest` 将取消嵌套数组的所有级别:因此,如果您尝试对数组数组进行排序,那么您将得到意想不到的结果:数组的形状被保留,但值是单独排序的,而不是作为子数组。 (2认同)
  • 嗨,**bigint** 没有类似的扩展名吗? (2认同)

Tom*_*zky 15

在PostrgreSQL 8.4及更高版本中,您可以使用:

select array_agg(x) from (select unnest(ARRAY[1,5,3,7,2]) AS x order by x) as _;
Run Code Online (Sandbox Code Playgroud)

但它不会很快.


在较旧的Postgres中,你可以像这样实现这个

CREATE OR REPLACE FUNCTION unnest(anyarray)
  RETURNS SETOF anyelement AS
$BODY$
SELECT $1[i] FROM
    generate_series(array_lower($1,1),
                    array_upper($1,1)) i;
$BODY$
  LANGUAGE 'sql' IMMUTABLE
Run Code Online (Sandbox Code Playgroud)

和array_agg这样:

CREATE AGGREGATE array_agg (
        sfunc = array_append,
        basetype = anyelement,
        stype = anyarray,
        initcond = '{}'
);
Run Code Online (Sandbox Code Playgroud)

但它会更慢.


您还可以在pl/pgsql中实现任何排序算法,或者您可以插入postgres的任何其他语言.


Fra*_*ens 12

只需使用函数unnest():

SELECT 
    unnest(ARRAY[1,2]) AS x
ORDER BY 
    x DESC;
Run Code Online (Sandbox Code Playgroud)

请参阅Pg文档中的数组函数.


Ada*_*ent 7

这对我有用,来自http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I#General_array_sort

CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL
AS $$
SELECT ARRAY(
    SELECT $1[s.i] AS "foo"
    FROM
        generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
    ORDER BY foo
);
$$;
Run Code Online (Sandbox Code Playgroud)

请看Craig的回答,因为他对Postgres的了解要多得多,并且有更好的答案.如果可能,也投票删除我的答案.