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;




转载于:https://www.cnblogs.com/ldxsuanfa/p/10497767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一款功能强大的关系型数据库管理系统(RDBMS),它支持多种数据类型,包括数组数组是一种特殊的数据结构,可以存储一组有序的相同类型的数据项。在PostgreSQL中,数组是一种嵌套的数据类型,可以存储一组值,这些值可以是任何数据类型。 PostgreSQL中的数组类型可以用于存储一系列的值,这些值可以是相同的数据类型,也可以是不同数据类型的组合。数组在查询和操作方面提供了方便的方法,例如使用索引和过滤器等。 在PostgreSQL中,可以使用以下语法创建数组: ```sql CREATE TABLE table_name ( column_name ARRAY(data_type) ); ``` 其中,`table_name`是表的名称,`column_name`是列的名称,`data_type`是数组中元素的类型。 例如,创建一个名为`students`的表,其中包含一个名为`grades`的数组列,可以这样创建: ```sql CREATE TABLE students ( id INT, name VARCHAR(50), grades INT[] ); ``` 在上述示例中,`grades`列是一个整数类型的数组列。 要向数组中添加元素,可以使用`ARRAY()`函数和花括号语法。例如,要将一个整数添加到`grades`数组中,可以使用以下语句: ```sql INSERT INTO students (id, name, grades) VALUES (1, 'John', ARRAY[5, 8, 9]); ``` 上述语句将一个整数列表添加到`grades`数组中。如果要查询某个列的数组数据,可以使用类似以下的语法: ```sql SELECT column_name FROM table_name WHERE condition; ``` 可以使用WHERE子句来过滤数组中的元素。例如,要查询`grades`数组中大于等于7的元素,可以使用以下语句: ```sql SELECT * FROM students WHERE grades @> '{7, 8}'; ``` @>`运算符用于比较数组中的元素是否符合给定的条件。在这种情况下,它返回满足条件的元素。 除了基本的数组操作之外,PostgreSQL还提供了其他高级功能,如数组索引、过滤器、排序等。这些功能可以帮助您更高效地处理数组数据。有关更多详细信息,请参阅PostgreSQL文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值