加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【原创】PostgreSQL 给数组排序

发布时间:2020-12-13 17:28:34 所属栏目:百科 来源:网络整理
导读:PostgreSQL 支持数组,但是没有对数据内部元素进行排序的一个函数。 今天我分别用PLPGSQL和PLPYTHONU写了一个。 示例表结构: t_girl=#dtest_array;Table"ytt.test_array"Column|Type|Modifiers--------+-----------+-------------------------------------

PostgreSQL 支持数组,但是没有对数据内部元素进行排序的一个函数。 今天我分别用PLPGSQL和PLPYTHONU写了一个。

示例表结构:

t_girl=#dtest_array;
Table"ytt.test_array"
Column|Type|Modifiers
--------+-----------+---------------------------------------------------------
id|integer|notnulldefaultnextval('test_array_id_seq'::regclass)
str1|integer[]|
Indexes:
"test_array_pkey"PRIMARYKEY,btree(id)

示例数据:

t_girl=#select*fromtest_array;
id|str1
----+---------------------------
1|{100,200,300,5,10,20,100}
2|{200,100,2,30,5}
3|{2000,101,10}
(3rows)
Time:1.513ms

plsql存储函数array_sort执行结果:

升序

t_girl=#selectid,array_sort(str1,'asc')fromtest_array;
id|array_sort
----+---------------------------
1|{5,300}
2|{0,200}
3|{0,2000}
(3rows)
Time:2.377ms

降序

t_girl=#selectid,'desc')fromtest_array;
id|array_sort
----+---------------------------
1|{300,5}
2|{200,0}
3|{2000,0}
(3rows)
Time:3.318ms
t_girl=#

python 存储函数array_sort_python 执行结果:

降序:

t_girl=#selectid,array_sort_python(str1,'desc')fromtest_array;
id|array_sort_python
----+---------------------------
1|{300,0}
(3rows)
Time:2.797ms

升序:

t_girl=#selectid,'asc')fromtest_array;
id|array_sort_python
----+---------------------------
1|{5,2000}
(3rows)
Time:1.856ms
t_girl=#


附: array_sort_python 代码:

CREATEorreplaceFUNCTIONarray_sort_python(c1text[],f_ordertext)RETURNStext[]AS$$
result=[]
iff_order.lower()=='asc':
c1.sort()
result=c1
eliff_order.lower()=='desc':
c1.sort(reverse=True)
result=c1
else:
pass
returnresult
$$LANGUAGEplpythonu;



array_sort 代码:

createorreplacefunctionarray_sort(anyarray,f_ordertext)returnsanyarray
as
$ytt$
declarearray1aliasfor$1;
tmpint;
resulttext[];
begin
iflower(f_order)='desc'then
fortmpinselectunnest(array1)asaorderbyadesc
loop
result:=array_append(result,tmp::text);
endloop;
returnresult;
elsiflower(f_order)='asc'then
fortmpinselectunnest(array1)asaorderbyaasc
loop
result:=array_append(result,tmp::text);
endloop;
returnresult;
else
returnarray['f_ordermustbeascordesc!'];
endif;
end;
$ytt$languageplpgsql;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读