PostgreSQL 给数组排序

Posted ldxsuanfa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL 给数组排序相关的知识,希望对你有一定的参考价值。

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,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 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,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 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;




以上是关于PostgreSQL 给数组排序的主要内容,如果未能解决你的问题,请参考以下文章

markdown 数组排序片段

java基础3-重载+命令行传参+递归+数组+排序

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

将数组文字传递给 PostgreSQL 函数

将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素

将数组值从 JPA/Hibernate 传递给 PostgreSQL