评论

收藏

[JavaScript] 【原创】PostgreSQL 给数组排序

开发技术 开发技术 发布于:2021-06-24 09:14 | 阅读数:369 | 评论:0

  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;

关注下面的标签,发现更多相似文章