Welcome 微信登录

首页 / 数据库 / MySQL / PostgreSQL 给数组排序

PostgreSQL 支持数组,但是没有对数据内部元素进行排序的一个函数。  今天我分别用PLPGSQL和PLPYTHONU写了一个。------------------------------------华丽丽的分割线------------------------------------CentOS 6.3环境下yum安装PostgreSQL 9.3 http://www.linuxidc.com/Linux/2014-05/101787.htmPostgreSQL缓存详述 http://www.linuxidc.com/Linux/2013-07/87778.htmWindows平台编译 PostgreSQL http://www.linuxidc.com/Linux/2013-05/85114.htmUbuntu下LAPP(Linux+Apache+PostgreSQL+PHP)环境的配置与安装 http://www.linuxidc.com/Linux/2013-04/83564.htmUbuntu上的phppgAdmin安装及配置 http://www.linuxidc.com/Linux/2011-08/40520.htmCentOS平台下安装PostgreSQL9.3 http://www.linuxidc.com/Linux/2014-05/101723.htmPostgreSQL配置Streaming Replication集群 http://www.linuxidc.com/Linux/2014-05/101724.htm------------------------------------华丽丽的分割线------------------------------------示例表结构:t_girl=# d test_array;                            Table "ytt.test_array" Column | Type    |                        Modifiers                       --------+-----------+--------------------------------------------------------- id   | integer | not null default nextval("test_array_id_seq"::regclass) str1 | integer[] |Indexes:    "test_array_pkey" PRIMARY KEY, btree (id)
示例数据:t_girl=# select * from test_array;                                        id |         str1           ----+---------------------------  1 | {100,200,300,5,10,20,100}  2 | {200,100,2,30,0,5}  3 | {2000,101,2,30,0,10}(3 rows)Time: 1.513 ms
plsql存储函数array_sort执行结果:升序t_girl=# select id,array_sort(str1,"asc") from test_array;       id |        array_sort        ----+---------------------------  1 | {5,10,20,100,100,200,300}  2 | {0,2,5,30,100,200}  3 | {0,2,10,30,101,2000}(3 rows)Time: 2.377 ms降序t_girl=# select id,array_sort(str1,"desc") from test_array;   id |        array_sort        ----+---------------------------  1 | {300,200,100,100,20,10,5}  2 | {200,100,30,5,2,0}  3 | {2000,101,30,10,2,0}(3 rows)Time: 3.318 mst_girl=#python 存储函数array_sort_python 执行结果:降序:t_girl=# select id,array_sort_python(str1,"desc") from test_array; id |   array_sort_python    ----+---------------------------  1 | {300,200,100,100,20,10,5}  2 | {200,100,30,5,2,0}  3 | {2000,101,30,10,2,0}(3 rows)Time: 2.797 ms升序:t_girl=# select id,array_sort_python(str1,"asc") from test_array;    id |   array_sort_python    ----+---------------------------  1 | {5,10,20,100,100,200,300}  2 | {0,2,5,30,100,200}  3 | {0,2,10,30,101,2000}(3 rows)Time: 1.856 mst_girl=#附: array_sort_python 代码:CREATE or replace FUNCTION array_sort_python(c1 text [],f_order text) RETURNS text [] AS $$result = []if f_order.lower() == "asc":    c1.sort()    result = c1elif f_order.lower() == "desc":    c1.sort(reverse=True)    result = c1else:    passreturn result$$ LANGUAGE plpythonu;array_sort 代码:create or replace function array_sort(anyarray,f_order text) returns anyarray as $ytt$declare array1 alias for $1;              tmp int;      result text [];begin  if lower(f_order) = "desc" then    for tmp in select unnest(array1) as a order by a desc    loop      result := array_append(result,tmp::text);    end loop;    return result;  elsif lower(f_order) = "asc" then    for tmp in select unnest(array1) as a order by a asc    loop      result := array_append(result,tmp::text);    end loop;    return result; else   return array["f_order must be asc or desc!"]; end if;end;$ytt$ language plpgsql;PostgreSQL 的详细介绍:请点这里
PostgreSQL 的下载地址:请点这里本文永久更新链接地址