PostgreSQL 给数组排序
发布时间:2020-12-13 17:28:35 所属栏目:百科 来源:网络整理
导读:PostgreSQL 支持数组,但是没有对数据内部元素进行排序的一个函数。 今天我分别用PLPGSQL和PLPYTHONU写了一个。 示例表结构: t_girl=# d test_array; Table "ytt.test_array" Column | Type | Modifiers --------+-----------+----------------------------
PostgreSQL 支持数组,但是没有对数据内部元素进行排序的一个函数。 今天我分别用PLPGSQL和PLPYTHONU写了一个。
示例表结构: 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,5} 3 | {2000,101,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,300} 2 | {0,200} 3 | {0,2000} (3 rows) Time: 2.377 ms 降序 t_girl=# select id,'desc') from test_array; id | array_sort ----+--------------------------- 1 | {300,5} 2 | {200,0} 3 | {2000,0} (3 rows) Time: 3.318 ms t_girl=# python 存储函数array_sort_python 执行结果: 降序: t_girl=# select id,array_sort_python(str1,'desc') from test_array; id | array_sort_python ----+--------------------------- 1 | {300,0} (3 rows) Time: 2.797 ms 升序: t_girl=# select id,'asc') from test_array; id | array_sort_python ----+--------------------------- 1 | {5,2000} (3 rows) Time: 1.856 ms t_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 = c1 elif f_order.lower() == 'desc': c1.sort(reverse=True) result = c1 else: pass return 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |